变量在嵌套循环内不会改变 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])
而且您根本不需要索引 i
和 j
,删除它们。
好的,这段代码有几处错误。首先你甚至不检查子字符串,其次你的循环是倒退的。
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
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])
而且您根本不需要索引 i
和 j
,删除它们。
好的,这段代码有几处错误。首先你甚至不检查子字符串,其次你的循环是倒退的。
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