通过其他分隔符将文本拆分为csv,但在每列中保留逗号

时间:2017-05-04 03:27:09

标签: python csv python-2.x python-2.6 libreoffice-calc

我有一个包含管道的txt文件分隔值,但遗憾的是,我遇到了一些错误,csv DictReader假设列中的逗号实际上是n列的n个值。我试过了

  

skipinitialspace = True

参数,但它不起作用。

我的txt文件,“test.csv”;

Name|Company|Age|Gender|Fav Color|Fav Food
John|Custom Inc|23|Male|Red, Blue, Yellow|Chocolate
Mary|Troopers   , Inc|25|Female|Black|Chocolate
Riki|Dorw Technology|33|Male|White, Yellow, Black|Ice cream, pudding

我的代码:

import csv

name= []
company = []
age = []
gender = []
fav_color = []
fav_food = []

with open("test.csv", "rU") as f:
    reader = csv.Dictreader(f, delimiter = '|')
    for row in reader:
        name.append(row['Name'])
        company.append(row['Company'])
        age.append(row['Age'])
        gender.append(row['Gender'])
        fav_color.append(row['Fav Color'])
        fav_food.append(row['Fav Food'])

RESULT_ADD = [[] for _ in range(len(name))]
for attr in range(len(name)):
    RESULT_ADD[attr].append(name[attr])
    RESULT_ADD[attr].append(company[attr])
    RESULT_ADD[attr].append(age[attr])
    RESULT_ADD[attr].append(gender[attr])
    RESULT_ADD[attr].append(fav_color[attr])
    RESULT_ADD[attr].append(fav_food[attr])

with open("result.csv", "w") as newfile:
    header = ['NAME_OF_CEO', 'NAME_OF_COMPANY' , 'AGE', 'GENDER', 'FAV_COLOR', 'FAV_FOOD']
    wr.csv.writer(newfile, delimiter= ';', quoting = csv.QUOTE_MINIMAL)
    wr.writerow(header)
    for item in RESULT_ADD:
        wr.writerow(item)

我得到了什么;

NAME_OF_CEO;NAME_OF_COMPANY;AGE;GENDER;FAV_COLOR;FAV_FOOD
John;Custom Inc;23;Male;Red,Blue,Yellow;Chocolate
Mary;T,r,o,o,p,e,r,s,,, ,I,n,c;25;Female;Black;Chocolate
Riki;Dorw Technology;33;Male;White,Yellow,Black;Ice cream,pudding

这里的第一个问题是;

  

对于John,FAV_COLOR包含“Red”,而FAV_FOOD包含“Blue”,下一个无名列包含“Yellow”和“Banana”,位于下一个空的无名列。

     

对于Mary,T,r,o,o,p,e,r,s ,,,, I,n,c,在LibreOffice中打开时,单词“Troopers”位于NAME_OF_THE_COMPANY但是“Inc”位于AGE专栏,然后年龄25位于下一栏,FAV_COLOR等,

     

对于Riki,与John相同的问题

1 个答案:

答案 0 :(得分:1)

您可以尝试使用pandas,因为数据帧对于处理表格数据非常有用:

import pandas as pd
df = pd.read_csv("test.csv", sep = "|")
df.to_csv("result.csv", sep=";")

通过这种方式,您无需为每个属性维护和填充单个列表。一旦习惯了数据帧,它们就会很棒。

关于在LibreOffice中导入,我没有对此进行测试,但根据文档https://help.libreoffice.org/Calc/Importing_and_Exporting_CSV_Files

  

如果字段或单元格包含逗号,则字段或单元格必须为   用单引号(')或双引号(“)括起来。

我希望有所帮助!