Python 我的CSV编写器代码在字符之间而不是字符串之间编写分隔符

Python 我的CSV编写器代码在字符之间而不是字符串之间编写分隔符,python,csv,file-io,output,writer,Python,Csv,File Io,Output,Writer,我已经编写了代码,它可以写入CSV文件,从另一个文件读取。我想从输入文件中写出特定的列,因此我将它们附加到一个列表中,然后用逗号分隔它们并将它们添加到行中,但输出文件显示单个单词的字符也用逗号分隔。我只想把文字分开,不想把字符分开 import csv def csv_reader(file,path): with open(path, 'w') as f1, open(file, 'r') as f2: write = csv.writer(f1, delimiter=

我已经编写了代码,它可以写入CSV文件,从另一个文件读取。我想从输入文件中写出特定的列,因此我将它们附加到一个列表中,然后用逗号分隔它们并将它们添加到行中,但输出文件显示单个单词的字符也用逗号分隔。我只想把文字分开,不想把字符分开

import csv
def csv_reader(file,path):
    with open(path, 'w') as f1, open(file, 'r') as f2:
        write = csv.writer(f1, delimiter=',')
        read  = csv.reader((line.replace('\0','') for line in f2), delimiter="\t")
        i=1
        for row in read:
            if(len(row)==0):
                continue
            if(row[3]=="Trade"):
                continue
            else:
                if(row[6]==""):
                    r = [row[0],row[0],'A',row[8],row[9],row[0]]
                    line = ','.join(r)
                    print(line)
                    write.writerow(line)
                else:
                    r = [row[0],row[0],'B',row[6],row[7],row[0]]
                    line = ','.join(r)
                    print(line)
                    write.writerow(line)
if __name__ == "__main__":
    path = "sales.csv"
    csv_path = "FlowEdge-TRTH-Time_Sales.csv"
    csv_reader(csv_path,path)
这显示了如下输出:

    0,7,0,0,4,5,0,0,0,0,C,8,.,H,K,",",0,7,0,0,4,5,0,0,0,0,C,8,.,H,K,",",B,",",5,.,7,",",4,",",0,7,0,0,4,5,0,0,0,0,C,8,.,H,K
虽然它应该是这样的:

    0700450000C8.HK,0700450000C8.HK,B,5.7,4,0700450000C8.HK
当我做以下修改时

   write.writerow([line])
它在excel文件的一列中显示完整的字符串,这意味着只有一列,而我需要6列。

问题在于:

line=','.join(r)
print(line)
write.writerow(line)
writerow
方法需要列列表。它将在列之间添加逗号(并引用或转义任何需要的内容,等等)

但你没有给它列的列表;你给它一根线。join(r)的作用是:将列列表转换为单个逗号分隔的字符串

当您给
writerow
一个字符串而不是字符串列表时,它会将该字符串视为一个字符序列。(这并不特定于
csv
;在Python中,字符串是一个字符序列。)因此它将每个字符视为一列,并在它们之间添加逗号

只要这样做:

write.writerow(r)

如果您只想从一个
.csv
文件中读取特定的列集并将它们输出到另一个文件,您可以尝试使用该模块

它首先将
csv
加载到名为
data
的变量。只有在
usecols
中定义的列才会被导入。您可以通过名称或索引引用列(例如,您可以
usecols=[0,1,2]
-这将导入前3列)

然后,借助于
.to\csv
方法,变量可以很容易地再次保存到
csv
文件。

csv.writerow()函数获取项目列表,并使用所需的分隔符(默认情况下,这是逗号)将其写入文件。例如:

列表
['a','b','c']
作为
a,b,c

import csv

def csv_reader(file,path):
    with open(path, 'w', newline='') as f_output, open(file, 'r', newline='') as f_input:
        csv_output = csv.writer(f_output)
        csv_input = csv.reader((line.replace('\0', '') for line in f_input))

        for row in csv_input:
            if len(row) and row[3] != "Trade":
                if row[6] == "":
                    output_row = [row[0], row[0], 'A', row[8], row[9], row[0]]
                else:
                    output_row = [row[0], row[0], 'B', row[6], row[7], row[0]]

                print(','.join(output_row))
                csv_output.writerow(output_row)

if __name__ == "__main__":
    path="sales.csv"
    csv_path = "FlowEdge-TRTH-Time_Sales.csv"
    csv_reader(csv_path, path)

使用csv读写器时,应使用
newline=''
参数打开文件

谢谢大家,但我在代码中发现了错误

    read  = csv.reader((line.replace('\0','') for line in f2), delimiter="\t")
这是一个错误,因为我在csv文件中使用tab作为分隔符

更正为

    read  = csv.reader((line.replace('\0','') for line in f2), delimiter=",")

首先,我建议拆分您的代码-一种做任何事情的方法都是不好的习惯-当这样做时,使用以下建议将读写拆分为一个较小的单独任务:我相信您很容易发现错误。问题是您正在执行
line=','。join(r)
,它将列列表转换为带有逗号的单个字符串,然后将该字符串传递给
writerow
,后者将迭代该字符串,将每个字符视为自己的列。做一个或另一个,而不是两个。@abarnert但当我将[line]传递给行写入器时,输出文件只有一列。如果我直接传递r列表,那么输出文件会显示奇怪的文本,即使在编码后仍然保持不变unicode@abhihacker02谁让你通过
[line]
?我不知道你的确切意思,但(a)这听起来像是一个全新的问题,这意味着你可能想问一个新问题,以及(b)无论哪种方式,你必须给我们一个答案,而不是让我们猜测你的输入可能是什么,你在尝试“用unicode编码”时可能出错了什么,以及那些“奇怪的字符”是什么可能是。如果我直接传递r列表,则输出文件显示奇怪的文本,即使在对列进行编码后仍然保持不变。这取决于正在读取的文件,因此最终我必须首先读取它,它显示以下奇怪的文本->䥒ⱃ䥒ⱃⱂ楂⁤牐捩ⱥ楂⁤楓敺L勾䍉਍㜰〰㔴〰〰㡃䠮ⱋ㜰〰㔴〰〰㡃䠮ⱋⱂ⸵ⰷⰴ㜰〰㔴〰〰㡃䠮ോ《〷㐰〵〰䌰⸸䭈〬〷㐰〵〰䌰⸸䭈䈬㘬㘮ㄬ〬〷㐰〵〰䌰⸸䭈਍㜰〰㔴〰〰㡃䠮ⱋ㜰〰㔴〰〰㡃䠮ⱋⱂ⸷㌰ㄬ〬〷㐰〵〰䌰⸸䭈਍㜰〰㔴〰〰㡃䠮ⱋ㜰〰㔴〰〰㡃䠮ⱋⱁ㠱㌬〬〷㐰〵〰䌰⸸䭈਍㜰〰㔴〰〰㡃䠮ⱋ㜰〰㔴〰〰㡃䠮ⱋⱁ㜱㔬㐰〬〷㐰〵〰䌰⸸䭈਍㜰〰㔴〵〰䌰⸸䭈䄬ㄬ⸵㌱㔬ⰹ㜰〰㔴〰〰㡃䠮ോ《〷㐰〵〰䌰⸸䭈〬〷㐰〵〰䌰⸸䭈䈬ㄬ ... 我不得不删除其中的一些,因为它太长了。你可以编辑这个问题,从你的CSV文件中包含一些合适的样本行吗?或者你可以使用pastebin之类的东西发布一个指向整个文件的链接。
    read  = csv.reader((line.replace('\0','') for line in f2), delimiter=",")