Skip to main content
 首页 » 编程设计

Python:读取和拆分文件的快速方法是什么

2025年05月04日1052php

我需要读取一个文件并将其分成几行,然后用制表符将这些行分成两半,并去除所有语音标记。目前我有工作职能。但是,它相当慢:

temp = [] 
fp = open(fName, "r") 
for line in fp: 
    temp.append(line.replace("\"","").rstrip("\n").split("\t")) 
print temp 

这会将文件拆分为列表列表。它实际上可能只是一个列表,因为只要保留顺序,以后很容易将它重新分成两对。

一定有更快的方法来做到这一点。谁能让我走上正轨?

谢谢!

[edit] 我正在处理的文件很大,但我会添加类似的内容。 (有没有办法在堆栈溢出时上传文件?)

"CARMILLA"  "35" 
"JONATHAN R"    "AA2" 
"M" "3" 
"EMMA"  "350" 
"OLD"   "AA" 

应该返回:

["CARMILLA", "35", "JONATHON R", "AA2", "M", "3", "EMMA", "350", "OLD", "AA"] 

尽管我的代码将它作为 2 个字符串列表的列表返回,这也很好。

抱歉,我可能应该注意到 print 语句代表 return 语句 - 因为我将其从函数中取出,所以我将其更改为 print 以便在这里更有意义。

请您参考如下方法:

我认为列表理解会比为每一行调用 .append 更快

from itertools import chain 
with open('file.txt') as f: 
    lines = chain.from_iterable([l.replace(r'"','').rstrip('\n').split('\t',1) for l in f]) 

编辑:所以它会产生一个扁平化的列表

>>>  
['CARMILLA', '35', 'JONATHAN R', 'AA2', 'M', '3', 'EMMA', '350', 'OLD', 'AA'] 

非扁平化版本:

with open('file.txt') as f: 
    lines = [l.replace(r'"','').rstrip('\n').split('\t',1) for l in f] 

经过一段时间后,发现 OP 是最快的?

import timeit 
print("chain, list",timeit.timeit(r""" 
with open('file.txt') as f: 
    lines = chain.from_iterable([l.replace(r'"','').rstrip('\n').split('\t',1) for l in f])""",setup="from itertools import chain",number=1000)) 
print("flat       ",timeit.timeit(r""" 
with open('file.txt') as f: 
    lines = [l.replace(r'"','').rstrip('\n').split('\t',1) for l in f]""",setup="from itertools import chain",number=1000)) 
print("op's       ",timeit.timeit(r"""temp = [] 
fp = open('file.txt', "r") 
for line in fp: 
    temp.append(line.replace("\"","").rstrip("\n").split("\t")) 
""",number=1000)) 
print("jamlyks    ",timeit.timeit(r""" 
with open('file.txt', 'rb') as f: 
    r = csv.reader(f, delimiter=' ', skipinitialspace=True) 
    list(chain.from_iterable(r))""",setup="from itertools import chain; import csv",number=1000)) 
print("lennart    ",timeit.timeit(r""" 
    list(csv.reader(open('file.txt'), delimiter='\t', quotechar='"'))""",setup="from itertools import chain; import csv",number=1000)) 

产量

C:\Users\Henry\Desktop>k.py 
('chain, list', 0.04725674146159321) 
('my flat    ', 0.04629905135295972) 
("op's       ", 0.04391255644624917) 
('jamlyks    ', 0.048360870934994915) 
('lennart    ', 0.04569112379085424)