变量在嵌套循环内不会改变 python

variable does not change inside of a nested loop python

Python 初学者。我需要从第一个文件 "src.csv" 中获取每一行,其中包含类似 (300 rows)

的字符串
"12345, a, b"
"234567, e, c"

并在第二个文件中查找字符串 "data.csv"(100k 行)

"12345678"
"23456789011248"

通过第一个文件的第一列,其中数字是第二个文件中的一个字符串的子字符串。然后写入输出文件。

import sys
import csv



dat_file_name = "data.dat"
src_file_name = "src.csv"
out_file_name = "out.csv"

if (len(sys.argv) == 4):
    dat_file_name = sys.argv[1]
    src_file_name = sys.argv[2]
    out_file_name = sys.argv[3]


out_writer = open(out_file_name, "w")


i = 0
j = 0
with open(src_file_name, "r") as src, open(dat_file_name, 'r') as dat:
    src_reader = csv.reader(src)
    dat_reader = csv.reader(dat)

    for sub_string in src_reader:

        # print sub_string

        for string in dat_reader:

            out_writer.write(sub_string[0])
            out_writer.write("\n")

            print sub_string[0]

            i+=1
        j+=i


out_writer.close()

print i #for debug only
print j #for debug only

但是我得到的不是 "sub_string[0]" 的预期值,而是第一个文件第一行的第一个值...

12345
12345
...

在每次迭代中。更重要的是,输出文件包含 100k 行而不是 30m。

我的问题是为什么我的嵌套循环使用版本出现意外行为。为什么变量 "substring[0]" 在嵌套循环内部没有改变? 我将不胜感激任何帮助。

为什么要在嵌套循环中改变?内层循环遍历 dat_reader,但 sub_string 外层 迭代的结果,直到内层循环完全完成后才能更改。

你根本不需要嵌套循环;你想一次遍历这两个文件。您可以使用 zip:

for sub_string, string in zip(src_reader, dat_reader):
    out_writer.write(sub_string[0])

而且您根本不需要索引 ij,删除它们。

好的,这段代码有几处错误。首先你甚至不检查子字符串,其次你的循环是倒退的。

out_file_name = "out.csv"

if (len(sys.argv) == 4):
    dat_file_name = sys.argv[1]
    src_file_name = sys.argv[2]
    out_file_name = sys.argv[3]

with open(src_file_name, "r") as src, open(dat_file_name, 'r') as dat, open(out_file_name, "w") as out_writer:
    src_reader = csv.reader(src)
    dat_reader = csv.reader(dat)

    for string in dat_reader:    
        for sub_string in src_reader:
            if sub_string[0] in string: #Check if substring in string
                out_writer.write(sub_string[0])
                out_writer.write("\n")

                print sub_string[0]
        src.seek(0) #Your file pointer is at the end of the file so move it back to the beginning