在文件中压缩行并迭代列表

4 投票
5 回答
1212 浏览
提问于 2025-04-18 11:38

我想创建一个字典,字典的键来自一个列表 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.defaultdictenumerate 可以实现:

补充说明:可能更好的做法是直接把文件名传给函数:

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']})

撰写回答