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

时间:2018-05-11 06:23:46

标签: 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=',')
        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列。

2 个答案:

答案 0 :(得分:1)

问题在于:

line=','.join(r)
print(line)
write.writerow(line)

writerow方法需要列列表。它将在列之间添加逗号(并引用或转义需要它的任何内容等)。

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

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

这样做:

write.writerow(r)

答案 1 :(得分:0)

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=''参数打开该文件。