当前位置: 代码迷 >> python >> “for”循环在python 3.6中不起作用
  详细解决方案

“for”循环在python 3.6中不起作用

热度:44   发布时间:2023-06-13 13:59:52.0

我一直致力于组合 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;一;

2;乙;

3;c;

4;d;

5;e;

6; f;

7;克;

8;h;

9;我;

10/1;j;

10/2;k;

11;升;

12;米;

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;

您正在尝试不止一次地循环遍历一个文件对象。 文件对象就像一长段磁带,读取一行或一个块会移动文件指针,即下一次读取或写入将发生的位置。 读取整个文件后,该指针位于文件“磁带”的最末尾,并且无法从该位置读取更多内容(那里没有更多数据),直到通过其他方式再次移动文件指针.

每次要循环时,您都需要打开文件对象,或者将文件指针倒回到开头。 您可以使用执行后者。

但是,一次又一次地读取文件很慢。 由于您所做的只是将这些额外文件用作映射(将一行中的一个值映射到另一个值),因此您实际上应该将它们读入内存并放入字典中。 这样你就不必循环,并且在这个过程中让你的代码快得多。

您还应该使用,而不是自己拆分。 该模块更有效地处理读取和拆分,并且在引号和其他极端情况下正确处理:

import csv
import sys

with open(filename2, 'r', newline='') as file2:
    reader = csv.reader(file2, delimiter=';')
    file2_map = dict(row[:2] for row in reader)

with open(filename3, 'r', newline='') as file3:
    reader = csv.reader(file3, delimiter=';')
    file3_map = dict(row[:2] for row in reader)

with open(filename1, 'r', newline='') as file1:
    reader = csv.reader(file1, delimiter=';')
    writer = csv.writer(sys.stdout, delimiter=';')
    for dz1, dz2, *remainder in reader:
        wl1 = file2_map.get(dz1, '')
        wl2 = file2_map.get(dz2, '')
        kw1 = file3_map.get(dz1, '')
        kw2 = file3_map.get(dz2, '')
        writer.writerow([dz1, dz2, wl1, wl2, kw1, kw2])

由于您还要写出以分号分隔的信息,因此您可以使用相同的csv模块生成一个csv.writer()对象以再次写出数据。 在上面的例子中,我写到sys.stdout ,但你可以写任何你喜欢的文件。

  相关解决方案