在文件中压缩行并迭代列表
我想创建一个字典,字典的键来自一个列表 keys
,而值则是从多个文本文件中读取的行组成的列表。假设这个 keys
列表和所有要读取的文件都有相同的行数。
我该如何同时遍历 keys
列表和每个文件的行呢?我想用 zip()
函数,但这对我来说没成功。
我知道可以用以下方式遍历文件中的行:
currFile = open('myfile.txt', 'r')
for line in currFile:
# Do something
而且我知道可以用以下方式同时遍历两个列表:
for foo, bar in zip(foos, bars):
# Do something
但是这样做不行:
myDict = {}
keys = [17, 21, 8, 2, ..., 91]
currFile = open('myfile.txt', 'r')
for key, line in zip(keys, currFile):
myDict[key] = line
我可以把文件中的所有行提取到一个列表中,然后用 zip 函数再运行循环,但这样效率不高。
我该如何同时遍历 keys
列表和文件中的行,以便动态调用 zip() 呢?
5 个回答
0
keys = [1, 2, 3, 4]
files = [open('a'), open('b'), open('c'), open('d')]
for x in zip(keys, *files):
print x
补充说明:你最开始的想法是对的,只是缺少了扩展文件列表的语法。
0
使用标准的字典,不用zip,每次处理一个文件。可以用'with'来替代打开和关闭文件。正如之前提到的,每次处理一个文件可能在处理错误时会更好。
d = {}
keys = set([k1, k2, ...])
files = [f1, f2, ...]
for f in files:
ifs = open(f)
for n, line in enumerate(ifs):
if n in keys:
d.setdefault(n, []).append(line)
ifs.close()
0
def add_to_dict(someDict, filename, someNums):
with open(filename, 'r') as f:
for num, line in enumerate(f):
if num in someNums:
if num not in someDict:
someDict[num] = []
someDict[num].append(line)
myDict = {}
lineNums = [2,45,13,56]
add_to_dict(myDict, "file1.txt", lineNums)
add_to_dict(myDict, "file2.txt", lineNums)
补充说明:你也可以使用 defaultdict(list)
,正如 Sahand 所建议的那样,这样你就不需要了。
if num not in someDict:
someDict[num] = []
0
像这样,使用 collections.defaultdict
和 enumerate
可以实现:
补充说明:可能更好的做法是直接把文件名传给函数:
from collections import defaultdict
def lines_to_dictionary(*files):
result = defaultdict(list)
for file_name in files:
with open(file_name, 'r') as f:
for line_number, line in enumerate(f):
result[line_number].append(line.strip())
return result
result = lines_to_dictionary('1.csv', '2.csv')
print result[0] # Prints a list of first lines in all files
print result[1] # Prints a list of second lines in all files, etc...
1
我想创建一个字典,字典的键是行号,值是从多个文本文件中提取的行的列表。我们假设所有要读取的文件都有相同的行数。
这个方法可以处理任意数量的文件,这里演示的只有两个。演示文件 file1
的内容是:
line0
line1
line2
line3
演示文件 file2
的内容是:
line5
line6
line7
line8
现在,创建一个文件对象的列表 files
(例如 [open('file1','r'), open('file2','r')]
)。
from collections import defaultdict as ddict
d = ddict(list)
for number,lines in enumerate(zip(*files)):
for line in lines:
d[number].append(line)
我使用的是Python3,如果你用的是Python2.x,记得使用 izip
。然后关闭这些文件:
for file in files:
file.close()
字典 d
的内容是:
defaultdict(<type 'list'>, {0: ['line0\n', 'line5\n'], 1: ['line1\n', 'line6\n'], 2: ['line2\n', 'line7\n'], 3: ['line3\n', 'line8\n']})