Python 我的CSV编写器代码在字符之间而不是字符串之间编写分隔符
我已经编写了代码,它可以写入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=
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=",")