如何读取具有列分隔符以及记录分隔符的csv文件

时间:2018-10-11 09:34:06

标签: python pandas

我的CSV文件有3列:名称,年龄和性别,示例数据为:

AlexÇ39ÇM
#Ç#SheebaÇ35ÇF
#Ç#RiyaÇ10ÇF

列定界符为“Ç”,记录定界符为“#Ç#”。请注意,第一个记录没有记录定界符(#Ç#),但是所有其他记录都有记录定界符(#Ç#)。您能告诉我如何读取此文件并将其存储在数据框中吗?

1 个答案:

答案 0 :(得分:0)

csvpandas模块均支持直接读取csv文件。但是,由于在进一步处理之前需要逐行修改文件内容,因此建议逐行读取文件,根据需要修改每一行,并将处理后的数据存储在列表中以进行进一步处理。

必要步骤包括:

  • 打开文件
  • 逐行读取文件
  • 删除换行符(使用readlines()时是行的一部分
  • 替换记录定界符(因为一条记录等于一行)
  • 在列定界符处分割线

由于.split()返回了一个字符串元素列表,因此我们获得了列表的总体列表,其中每个“子列表”都包含/表示行/记录的数据。可以通过pandas.DataFrame.from_records()读取这样格式化的数据,这在当时非常方便:

import pandas as pd

with open('myData.csv') as file:
    # `.strip()` removes newline character from each line
    # `.replace('#;#', '')` removes '#;#' from each line
    # `.split(';')` splits at given string and returns a list with the string elements
    lines = [line.strip().replace('#;#', '').split(';') for line in file.readlines()]

df = pd.DataFrame.from_records(lines, columns=['Name', 'Age', 'Sex'])

print(df)

备注:

  1. 我将Ç更改为;,由于编码问题,对我来说效果更好。但是,该算法的基本思想仍然相同。

  2. 像这样手动读取数据可能会占用大量资源,这在处理较大文件时可能会出现问题。可能还有更优雅的方式,我不知道。如果遇到性能问题,请尝试分批读取文件或寻求更有效的实现。