我遇到的问题可以通过在csv(分号分隔(文件中显示几个示例行来说明,它们看起来像这样:
4;1;"COFFEE; COMPANY";4
3;2;SALVATION ARMY;4
请注意,在一行中,一个字符串用引号括起来,里面有一个分号(在我的输入文件中,除了包含分号的列外,没有一列的两边有引号(。
这些带有引号和分号的行造成了一个问题——基本上,我的代码是在计算列/字段中引号内的分号。因此,当我在这一行中读取时,它读取字符串中的分号作为分隔符,从而使这一行看起来像是有一个额外的字段/列。
想要的输出是这样的,"咖啡公司"周围没有引号,"咖啡"one_answers"公司"之间没有分号:
4;1;COFFEE COMPANY;4
3;2;SALVATION ARMY;4
事实上,这个关于"咖啡公司"的专栏对我来说完全没有用,所以最后的文件也可能是这样的:
4;1;xxxxxxxxxxx;4
3;2;xxxxxxxxxxx;4
如何只去掉这一列中的分号,而不去掉所有其他分号?
csv模块使处理这样的情况相对容易:
# Contents of input_file.csv
# 4;1;"COFFEE; COMPANY";4
# 3;2;SALVATION ARMY;4
import csv
input_file = 'input_file.csv' # Contents as shown in your question.
with open(input_file, 'r', newline='') as inp:
for row in csv.reader(inp, delimiter=';'):
row[2] = row[2].replace(';', '') # Remove embedded ';' chars.
# If you don't care about what's in the column, use the following instead:
# row[2] = 'xyz' # Value not needed.
print(';'.join(row))
打印输出:
4;1;COFFEE COMPANY;4
3;2;SALVATION ARMY;4
接下来的问题:如何将此数据写入新的csv文件?
import csv
input_file = 'input_file.csv' # Contents as shown in your question.
output_file = 'output_file.csv'
with open(input_file, 'r', newline='') as inp,
open(output_file, 'w', newline='') as outp:
writer= csv.writer(outp, delimiter=';')
for row in csv.reader(inp, delimiter=';'):
row[2] = row[2].replace(';', '') # Remove embedded ';' chars.
writer.writerow(row)
这里有一种使用Pandas库的替代方法,它使您不必为循环编码:
import pandas as pd
#Read csv into dataframe df
df = pd.read_csv('data.csv', sep=';', header=None)
#Remove semicolon in column 2
df[2] = df[2].apply(lambda x: x.replace(';', ''))
这给出了以下数据帧df:
0 1 2 3
0 4 1 COFFEE COMPANY 4
1 3 2 SALVATION ARMY 4
Pandas提供了几个内置功能,可以帮助您处理数据或得出统计结论。使用表格格式的数据也可以使使用它更加直观。