我正在尝试编写一个python脚本,其中代码作用于特定主文件夹的所有子文件夹中的所有CSV文件,其中CSV可以具有相似的名称,并且代码为每个输入CSV输出编辑的CSV文件。代码如下:
import os
import csv
import sys
for root, dirs, files in os.walk(sys.argv[1]):
for filename in files:
i = 0
while os.path.exists(str(i)+filename):
i += 1
with open(str(i)+filename, "wb") as g:
symbol = filename.rpartition('_')[-1].rpartition('.')[0]
reader = csv.reader(filename)
writer = csv.writer(g, delimiter='\t', quotechar='"', quoting=csv.QUOTE_ALL)
for row in reader:
row.insert(0, symbol.upper())
writer.writerow(row)
为了说明我可能有类似文件名的可能性,我在输出文件名中使用了一个迭代字符串。我还想在输出CSV中添加一个列,使其内容从输入文件名中借用 - 这是rpartition和其余代码的目的。但是......我输出的其中一个CSV输入如下所示:
"AA" "t"
"AA" "a"
"AA" "b"
"AA" "l"
"AA" "e"
"AA" "_"
"AA" "a"
"AA" "a"
"AA" "."
"AA" "c"
"AA" "s"
"AA" "v"
“AA”部分是正确的 - 它是该输入文件的符号。但是,我不知道为什么它继续在输出中显示输入文件的名称(table_aa.csv),因为我希望输入的内容显示在“AA”列旁边。
有人可以请您仔细查看代码并告诉我吗?
**************** EDIT ***************** 编辑代码:
import os
import csv
import sys
for root, dirs, files in os.walk(sys.argv[1]):
for filename in files:
pathname = os.path.join(root, filename)
i = 0
while os.path.exists(str(i)+filename):
i += 1
with open(str(i)+filename, "wb") as g:
symbol = filename.rpartition('_')[-1].rpartition('.')[0]
reader = csv.reader(pathname)
writer = csv.writer(g, delimiter='\t', quotechar='"', quoting=csv.QUOTE_ALL)
for row in reader:
row.insert(0, symbol.upper())
writer.writerow(row)
但现在输出是:
"AA" "Y"
"AA" "\"
"AA" "Y"
"AA" "2"
"AA" "\"
"AA" "t"
"AA" "a"
"AA" "b"
"AA" "l"
"AA" "e"
"AA" "_"
"AA" "a"
"AA" "a"
"AA" "."
"AA" "c"
"AA" "s"
"AA" "v"
这又是输入CSV中的输出。有什么想法吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
您的主要问题是您将输入文件 name 传递给csv.reader
,因此该名称字符串将用作数据源。您需要实际打开输入文件并将文件句柄传递给csv.reader
。
以下是代码的简化版本,它忽略了os.walk
的内容。最好在确定代码之前正确处理一个文件并尝试处理目录中的所有文件。一旦核心流程正常工作,您就可以扩展它。
为了测试这段代码,我创建了一个非常简单的数据文件:
r0c0,r0c1,r0c2,r0c3
r1c0,r1c1,r1c2,r1c3
r2c0,r2c1,r2c2,r2c3
r3c0,r3c1,r3c2,r3c3
r4c0,r4c1,r4c2,r4c3
代码:
import csv
import os
filename = 'qdata'
symbol = ['AA']
i = 0
outname = str(i) + filename
while os.path.exists(outname):
i += 1
outname = str(i) + filename
print('Saving to name:', outname)
with open(filename, 'rb') as infile:
reader = csv.reader(infile)
with open(outname, "wb") as outfile:
writer = csv.writer(outfile, delimiter='\t', quotechar='"', quoting=csv.QUOTE_ALL)
for row in reader:
row = symbol + row
writer.writerow(row)
输出文件:
"AA" "r0c0" "r0c1" "r0c2" "r0c3"
"AA" "r1c0" "r1c1" "r1c2" "r1c3"
"AA" "r2c0" "r2c1" "r2c2" "r2c3"
"AA" "r3c0" "r3c1" "r3c2" "r3c3"
"AA" "r4c0" "r4c1" "r4c2" "r4c3"
请注意,我使用row = symbol + row
创建了新的row
列表。这比使用.insert
修改列表更有效,因为.insert
方法必须移动所有后续列表项以为插入的项腾出空间。