用于CSV处理的Python脚本

时间:2016-01-07 05:45:20

标签: 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)+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中的输出。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您没有使用rootdirs来创建正确的路径。

for filename in [join(root, name)) for name in files)]:

您可以找到更多说明here

答案 1 :(得分:0)

您的主要问题是您将输入文件 name 传递给csv.reader,因此该名称字符串将用作数据源。您需要实际打开输入文件并将文件句柄传递给csv.reader

以下是代码的简化版本,它忽略了os.walk的内容。最好在确定代码之前正确处理一个文件并尝试处理目录中的所有文件。一旦核心流程正常工作,您就可以扩展它。

为了测试这段代码,我创建了一个非常简单的数据文件:

Q数据

r0c0,r0c1,r0c2,r0c3
r1c0,r1c1,r1c2,r1c3
r2c0,r2c1,r2c2,r2c3
r3c0,r3c1,r3c2,r3c3
r4c0,r4c1,r4c2,r4c3

代码:

test.py

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)

输出文件:

0qdata

"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方法必须移动所有后续列表项以为插入的项腾出空间。