Python:如何根据头字的出现将文件分成块

2024-05-29 03:10:49 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个文件:

NAME,ANDREW,AGE 20, BD 1979
NAT ENGLISH
OCC LONDON
INC 200$
NAME,SVEN,AGE 20, BD 1979
NAT SWEDISH
OCC FALUN
INC 100$
NAME,HANS,AGE 30, BD 1988
NAT GERMAN
OCC BERLIN
NOTE, HANDSOME ONE
NAME,LUDOVIC,AGE 40, BD 1955
NAT FRENCH
OCC BORDEAUX
INC 5000$
INTERESTS, FISHING
NAME,PETER
NAT DUTCH
SUMMARY,AGE:20,BD:1979,NAT:DUTCH,OCC:TILBURG,INC:1000$

我试着把它分成几个块,每个块以“NAME”开头,包含未知的行数,直到下一个“NAME”,当然最后一个块以文件结尾。 例如,我想存储在列表列表中的块,至少这是我的第一次尝试。 一般来说,我需要在以后对每个块分别进行迭代,所以存储方法是为以后的目标服务的。

我的代码看起来像:

start = 'NAME,'
end = 'NAME,'
flag_append = False
my_list = []

for line in open('sample_csv.csv').readlines():
    if line.startswith(start):
        data = line[len(start):]
        flag_append = True
        my_list.append(data)
    elif flag_append:
        temp = []
        temp.append(line)
        my_list.append(temp)
    elif line.startswith(end):
        flag_append = False
        break

print my_list

但这还不是我想要的。

我想要的结果是:

[['ANDREW,AGE 20, BD 1979\n','NAT ENGLISH\n','OCC LONDON\n', 'INC 200$\n'],['SVEN,AGE 20, BD 1979\n','NAT SWEDISH\n','OCC FALUN\n','INC 100$\n'],['HANS,AGE 30, BD 1988\n', 'NAT GERMAN\n', 'OCC BERLIN\n', 'NOTE, HANDSOME ONE\n'], ['LUDOVIC,AGE 40, BD 1955\n', 'NAT FRENCH\n', 'OCC BORDEAUX\n', 'INC 5000$\n', 'INTERESTS, FISHING\n'], ['PETER\n', 'NAT DUTCH\n', 'SUMMARY,AGE:20,BD:1979,NAT:DUTCH,OCC:TILBURG,INC:1000$']]

或示意:

[[chunk],[chunk],[chunk],[chunk]]

提前谢谢。

2012年10月26日编辑

谢谢大家的回答。 我选择了Kzhi的答案,因为他的解决方案没有省略拆分关键字。 对不起,我没有在我的问题中提到这个要求,你的答案是依赖于我笨拙的代码,在结果中省略了关键字。 干杯!


Tags: nameagemylinenatstarttempbd
3条回答

试试这个:

token = 'NAME,'

my_list = []
data = []

for line in open('test.csv').readlines():
    if line.startswith(token):
        if len(data) > 0:
            my_list.append(data)
        data = [line[len(token):]]
    else:
        data.append(line)


if len(data) > 0:
    my_list.append(data)

print my_list

我认为这是一个优雅的解决方案:

token = 'foo'
chunks = []
current_chunk = []

for line in open('sample_csv.csv'):
   if line.startswith(token) and current_chunk: 
      # if line starts with token and the current chunk is not empty
      chunks.append(current_chunk[:]) #  add not empty chunk to chunks
      current_chunk = [] #  make current chunk blank
   # just append a line to the current chunk on each iteration
   current_chunk.append(line)

chunks.append(current_chunk)  #  append the last chunk outside the loop

因此,拥有包含内容的文件:

foo
asdf
asdf
foo
foo
asdf
asdf
fooo

你会得到这样的结果:

[
    ['foo\n', 'asdf\n', 'asdf\n'], 
    ['foo\n'], 
    ['foo\n', 'asdf\n', 'asdf\n'], 
    ['fooo\n']
]

您可以从以下代码开始:

>>> """NAME,ANDREW,AGE 20, BD 1979
... NAT ENGLISH
... OCC LONDON
... INC 200$
... NAME,SVEN,AGE 20, BD 1979
... NAT SWEDISH
... OCC FALUN
... INC 100$
... NAME,HANS,AGE 30, BD 1988
... NAT GERMAN
... OCC BERLIN
... NOTE, HANDSOME ONE
... NAME,LUDOVIC,AGE 40, BD 1955
... NAT FRENCH
... OCC BORDEAUX
... INC 5000$
... INTERESTS, FISHING
... NAME,PETER
... NAT DUTCH
... SUMMARY,AGE:20,BD:1979,NAT:DUTCH,OCC:TILBURG,INC:1000$""".split('NAME,')
['', 'ANDREW,AGE 20, BD 1979\nNAT ENGLISH\nOCC LONDON\nINC 200$\n', 'SVEN,AGE 20, BD 1979\nNAT SWEDISH\nOCC FALUN\nINC 100$\n', 'HANS,AGE 30, BD 1988\nNAT GERMAN\nOCC BERLIN\nNOTE, HANDSOME ONE\n', 'LUDOVIC,AGE 40, BD 1955\nNAT FRENCH\nOCC BORDEAUX\nINC 5000$\nINTERESTS, FISHING\n', 'PETER\nNATDUTCH\nSUMMARY,AGE:20,BD:1979,NAT:DUTCH,OCC:TILBURG,INC:1000$']

此外,还可以使用filter函数筛选出“”个值,并使用列表理解使每个项成为列表而不是字符串。

相关问题 更多 >

    热门问题