python:使用大量较小的文件压缩大文件会跳过大文件中的行

时间:2018-04-03 16:15:04

标签: python-3.x

我有一些小文件(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来获得所需的配对。

1 个答案:

答案 0 :(得分:2)

这里发生了什么:

for i1, i2 in zip(f3, s_fobj):

zipf3获取值,然后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')