“for”循环在python3.6中不起作用

2024-10-02 14:20:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在组合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;


Tags: 文件字符串innoneforkwwlstr
1条回答
网友
1楼 · 发布于 2024-10-02 14:20:26

您试图多次循环一个文件对象。文件对象就像一段很长的磁带,读取一行或一个数据块会移动文件指针,即下一次读或写操作的位置。一旦你读了整个文件,指针就在文件“磁带”的末尾,你不能从这个位置读取更多的数据(那里没有更多的数据),直到文件指针通过其他方式再次移动。在

每次要循环时都需要打开file对象,或者将文件指针倒回起始位置。您可以使用^{} call来完成后者。在

然而,从一个文件读取是缓慢的。因为您所做的就是使用这些额外的文件作为映射(将一行中的一个值映射到另一个值),所以您应该将它们读入内存并放入字典。这样你就完全不必循环,并且使你的代码在这个过程中更快得多。在

您还应该使用^{} module,而不是拆分自己。该模块处理读取和拆分的效率更高,在引用和其他转角情况下也更正确:

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,但是你可以写任何你喜欢的文件。在

相关问题 更多 >