我一直在组合3个文本文件。在
在第一个文件中,我有对字符串(不是int)
在第二个文件中,我有来自文件1的字符串定义
在第三个文件中,对第一个文件中的字符串有另一个定义(也是字符串)
我的代码是:
for line1 in file1:
wl1 = ''
wl2 = ''
kw1 = ''
kw2 = ''
dz1, dz2, none = line1.split(';')
for line2 in file2:
dz_wl, wl, none = line2.split(';')
if str(dz_wl) == str(dz1):
wl1 = wl
elif str(dz_wl) == str(dz2):
wl2 = wl
for line3 in file3:
dz_kw, kw, none = line3.split(';')
if str(dz_kw) == str(dz1):
kw1 = kw
elif str(dz_kw) == str(dz2):
kw2 = kw
print(dz1 + ';' + wl1 + ';' + kw1 + ';' + dz2 + ';' + wl2 + ';' + kw2 + '\n')
它似乎可以工作,至少一次,因为它打印第一行的正确结果 结果是:
1;a;123;2;b;4124
2;;;3;;
4;;;5;;
6;;;7;;
6;;;8;;
9;;;1;;
7;;;1;;
7;;;3;;
6;;;4;;
7;;;10/2;;
10/2;;;10/1;;
12;;;13;;
11;;;3;;
为了使代码适用于每一行,需要更改什么?在
文件1包含:
1;2;
2;3;
4;5;
6;7;
6;8;
9;1;
7;1;
7;3;
6;4;
7;10/2;
10/2;10/1;
12;13;
11;3;
文件2:
1;a;
2;b;
3;c;
4;d;
5;e;
6;f;
7;g;
8;h;
9;i;
10/1;j;
10/2;k;
11;l;
12;m;
13;n;
文件3:
1;123;
2;321;
3;554;
4;3313;
5;334;
6;564;
7;3234;
8;56345;
9;2346;
10/1;342;
10/2;553;
11;23;
12;453;
13;2234;
您试图多次循环一个文件对象。文件对象就像一段很长的磁带,读取一行或一个数据块会移动文件指针,即下一次读或写操作的位置。一旦你读了整个文件,指针就在文件“磁带”的末尾,你不能从这个位置读取更多的数据(那里没有更多的数据),直到文件指针通过其他方式再次移动。在
每次要循环时都需要打开file对象,或者将文件指针倒回起始位置。您可以使用^{} call 来完成后者。在
然而,从一个文件读取是缓慢的。因为您所做的就是使用这些额外的文件作为映射(将一行中的一个值映射到另一个值),所以您应该将它们读入内存并放入字典。这样你就完全不必循环了,并且使你的代码在这个过程中更快得多。在
您还应该使用^{} module ,而不是拆分自己。该模块处理读取和拆分的效率更高,在引用和其他转角情况下也更正确:
由于您还需要写出分号分隔的信息,因此可以使用相同的
csv
模块生成一个csv.writer()
对象来再次写出数据。在上面的例子中,我写的是sys.stdout
,但是你可以写任何你喜欢的文件。在相关问题 更多 >
编程相关推荐