Python初学者。我需要从第一个文件" src.csv"中获取每一行,其中包含类似(300行)的字符串
"12345, a, b"
"234567, e, c"
并在第二个文件中找到字符串" data.csv" (100k行)
"12345678"
"23456789011248"
第一个文件的第一个coloumn,其中digits是secon文件中某个字符串的子字符串。然后写入输出文件。
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]"嵌套循环内部不会改变? 我将不胜感激任何帮助。
答案 0 :(得分:0)
为什么它应该在嵌套循环中改变?内部循环遍历dat_reader
,但sub_string
是外部迭代的结果,它不会发生变化,直到内部循环完全结束。
你根本不想要一个嵌套循环;你想一次循环两个文件。您可以使用zip
:
for sub_string, string in zip(src_reader, dat_reader):
out_writer.write(sub_string[0])
您根本不需要索引i
和j
,请将其删除。
答案 1 :(得分:0)
好吧,这段代码有些不对劲。首先,你甚至不检查子串,然后你的循环是倒退的。
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