用于CSV处理的Python脚本
我正在尝试编写一个python脚本,其中代码作用于特定主文件夹的所有子文件夹中的所有CSV文件,其中CSV可以有类似的名称,并且代码为每个输入CSV输出一个编辑过的CSV文件。代码如下:用于CSV处理的Python脚本,python,python-2.7,csv,concatenation,Python,Python 2.7,Csv,Concatenation,我正在尝试编写一个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
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”列旁边
有人能看一下代码并告诉我吗
****************编辑*****************
将代码编辑为:
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中的输出。有什么想法吗?您没有使用
root
和dirs
创建正确的路径
for filename in [join(root, name)) for name in files)]:
您可以找到更多说明您没有使用
root
和dirs
来创建正确的路径
for filename in [join(root, name)) for name in files)]:
您可以找到更多说明您的主要问题是将输入文件名传递给
csv.reader
,因此名称字符串被用作数据源。您需要实际打开输入文件并将文件句柄传递给csv.reader
下面是一个简化版本的代码,它忽略了os.walk
的内容。在开始尝试处理目录中的所有文件之前,最好确保代码正确处理一个文件。一旦核心流程正常运行,就可以扩展它
为了测试这段代码,我创建了一个非常简单的数据文件:
qdata
守则:
test.py
输出文件:
0qdata
请注意,我使用
row=symbol+row
创建了一个新的行
列表。这比使用.insert
修改列表更有效,因为.insert
方法必须移动所有后续列表项以为插入的项腾出空间。您的主要问题是将输入文件名传递给csv.reader
,因此名称字符串被用作数据源。您需要实际打开输入文件并将文件句柄传递给csv.reader
下面是一个简化版本的代码,它忽略了os.walk
的内容。在开始尝试处理目录中的所有文件之前,最好确保代码正确处理一个文件。一旦核心流程正常运行,就可以扩展它
为了测试这段代码,我创建了一个非常简单的数据文件:
qdata
守则:
test.py
输出文件:
0qdata
请注意,我使用
row=symbol+row
创建了一个新的行
列表。这比使用.insert
修改列表更有效,因为.insert
方法必须移动所有后续列表项以为插入的项目腾出空间。对不起,请您详细说明一下好吗?刚试着用行“for filename in files:”替换为“for filename in[os.path.join(root,name)for name in files]:”,它给了我一个命令promt error没有文件或目录退出”(与文件路径前面添加了一个数字有关?对不起,请您再详细说明一下好吗?只是尝试在[os.path.join(root,name)中为文件名使用行“文件中的文件名:”替换为“文件中的文件名”:'它给我一个命令promt error.'没有文件或目录退出'(与在文件路径前面添加一个数字有关吗?
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"