我有一些小文件(f1和f2)和一个“大”文件(f3):
In [1]: cat f1
1
2
3
4
5
6
In [2]: cat f2
1
2
3
4
5
6
In [3]: cat f3
a
b
c
d
e
f
g
h
i
j
k
l
In [4]: small_files = ['f1', 'f2']
我希望zip
大文件中的行与小文件中的行,以便我得到像这样的对:
('a\n', '1\n')
('b\n', '2\n')
('c\n', '3\n')
('d\n', '4\n')
('e\n', '5\n')
('f\n', '6\n')
('g\n', '1\n')
('h\n', '2\n')
('i\n', '3\n')
('j\n', '4\n')
('k\n', '5\n')
('l\n', '6\n')
但是当我尝试这个时,第二批中的大文件的第一行 ('g')被跳过:
In [5]: with open('f3') as f3:
...: for small_file in small_files:
...: with open(small_file) as s_fobj:
...: for i1, i2 in zip(f3, s_fobj):
...: print((i1, i2))
...:
('a\n', '1\n')
('b\n', '2\n')
('c\n', '3\n')
('d\n', '4\n')
('e\n', '5\n')
('f\n', '6\n')
('h\n', '1\n')
('i\n', '2\n')
('j\n', '3\n')
('k\n', '4\n')
('l\n', '5\n')
('\n', '6\n')
我想了解为什么会发生这种情况,如果有办法我可以修改上面的代码,仍然使用zip
来获得所需的配对。
答案 0 :(得分:2)
这里发生了什么:
for i1, i2 in zip(f3, s_fobj):
zip
从f3
获取值,然后从s_fobj
获取值。由于s_fobj
已到达文件末尾,zip
会停止(使用最短的序列)。
但是从f3
读取的数据并未放回f3
流中。它被丢弃了。
解决方法是将最短的序列作为第一个参数。
for i2, i1 in zip(s_fobj, f3):
由于s_fobj
会先停止,f3
不会消耗。
我最终的快速测试结果如下:
('a\n', '1\n')
('b\n', '2\n')
('c\n', '3\n')
('d\n', '4\n')
('e\n', '5\n')
('f\n', '6\n')
('g\n', '1\n') <==== the "g" is here, yay!
('h\n', '2\n')
('i\n', '3\n')
('j\n', '4\n')
('k\n', '5\n')
('l\n', '6\n')