我的 CSV 编写器代码在字符之间而不是字符串之间写入分隔符
My CSV writer code writes separators between characters and not strings
我编写了写入 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('[=10=]','') 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
文件中读取特定的一组列并将它们输出到另一个文件,您可以尝试 pandas 模块。
import pandas as pd
data = pd.read_csv('to_load.csv', usecols=['col1', 'col2'])
data.to_csv('to_save.csv', index=False)
它首先将 csv
加载到名为 data
的变量中。仅导入您在 usecols
中定义的列。您可以按名称或索引引用列(例如,您可以 usecols=[0, 1, 2]
- 这将导入前 3 列)。
然后变量可以很容易地再次保存到 csv
文件中,感谢 .to_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('[=10=]', '') 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('[=10=]','') for line in f2), delimiter="\t")
这是错误,因为我在 csv 文件中使用制表符作为分隔符。
更正为
read = csv.reader((line.replace('[=11=]','') for line in f2), delimiter=",")
要在 csv 文件中写入行,您应该将每个字符串包含在方括号中。
所以如果你使用 csvwriter.writerrow()
对象,如果你有一个像 'first_name' 这样的字符串,你应该在该字符串周围使用括号以避免 csv 文件中每个字符之间的 ','。
csvwriter.writerow(['first_name'])
此外,如果您想写多行,请使用如下所示的嵌套括号:
csvwriter.writerows([['first_name'],['last_name']])
我编写了写入 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('[=10=]','') 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
文件中读取特定的一组列并将它们输出到另一个文件,您可以尝试 pandas 模块。
import pandas as pd
data = pd.read_csv('to_load.csv', usecols=['col1', 'col2'])
data.to_csv('to_save.csv', index=False)
它首先将 csv
加载到名为 data
的变量中。仅导入您在 usecols
中定义的列。您可以按名称或索引引用列(例如,您可以 usecols=[0, 1, 2]
- 这将导入前 3 列)。
然后变量可以很容易地再次保存到 csv
文件中,感谢 .to_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('[=10=]', '') 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('[=10=]','') for line in f2), delimiter="\t")
这是错误,因为我在 csv 文件中使用制表符作为分隔符。
更正为
read = csv.reader((line.replace('[=11=]','') for line in f2), delimiter=",")
要在 csv 文件中写入行,您应该将每个字符串包含在方括号中。
所以如果你使用 csvwriter.writerrow()
对象,如果你有一个像 'first_name' 这样的字符串,你应该在该字符串周围使用括号以避免 csv 文件中每个字符之间的 ','。
csvwriter.writerow(['first_name'])
此外,如果您想写多行,请使用如下所示的嵌套括号:
csvwriter.writerows([['first_name'],['last_name']])