【问题标题】:Read csv file with regular expression delimeter使用正则表达式分隔符读取 csv 文件
【发布时间】:2020-12-11 10:40:57
【问题描述】:

我有一个这样的 csv 文件:

x,y,z, vec, s2
1,2,3,(1,2,3),5
3,4,3,(4,5,3),8

我想读取这个文件,vec 为 (a,b,c)。使用 pd.read_csv(filename) 读取时,读取方式不同。

【问题讨论】:

  • 是的,这真的不是标准的 csv。您通常可以指定一个引号字符,其中的分隔符被忽略,但在这里,您使用的是左括号和右括号。我强烈建议您修复生成此“csv”的任何内容

标签: python python-3.x pandas


【解决方案1】:

也许您应该将 csv 作为字符串加载,然后拆分为列表,最后将列表转换为数据框。

with open('test.csv') as f:
    csv = f.read()+'\n'
import re
import pandas as pd
reArr = re.findall('([^,]+),([^,]+),([^,]+),(.*),([^,]+)\n',csv)
df=pd.DataFrame(reArr[1:],columns=reArr[0])
print(df)
x y z vec s2
0 1 2 3 (1,2,3) 5
1 3 4 3 (4,5,3) 8

【讨论】:

    【解决方案2】:

    我会做这样的事情

    with open(r'myFile.csv', 'r') as file:
        data = file.read().split('\n')
    
    cols = data[0].split(', ') # Note there's a whitespace after the comma
    dat = [i.split(', ') for i in data[1:]]
    df = pd.DataFrame(dat, columns = cols)
    

    但是,请记住,此方法将您的值作为数据框中的字符串返回。使用apply() 函数和int() 将所有奇异数转换为整数应该很容易,但棘手的部分是将这些元组转换为实际元组。为此,请这样做...

    from ast import literal_eval
    df['vec'] = df['vec'].apply(literal_eval)
    

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多