Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于CSV处理的Python脚本_Python_Python 2.7_Csv_Concatenation - Fatal编程技术网

用于CSV处理的Python脚本

用于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

我正在尝试编写一个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”列旁边

有人能看一下代码并告诉我吗

****************编辑***************** 将代码编辑为:

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"