【问题标题】:Cleaning up a csv by delimiter通过分隔符清理 csv
【发布时间】:2019-04-15 15:14:05
【问题描述】:

我有一个 csv 文件,其中所有列都在一行中,用引号括起来并用逗号分隔。列在一行中。

csv 中的行以逗号分隔,如果有 2 个逗号,则表示存在缺失值。我想用这些参数分隔这些列。如果行有引号,则引号中的逗号不应作为分隔符,因为这是地址。

这是一个数据样本(它是一个csv,我把它转换成字典给你看)

{'Store code,"Biz","Add","Labels","TotalSe","DirectSe","DSe","TotalVe","SeVe","MaVe","Totalac","Webact","Dions","Ps"': {0: ',,,,"Numsearching","Numsearchingbusiness","Numcatprod","Numview","Numviewed","Numviewed2","Numaction","Numwebsite","Numreques","Numcall"',
  1: 'Nora,"Ora","Sgo, Mp, 2000",,111,44,33,121,1232,53411,4,5,,3',
  2: 'mc11,"21 old","tjis that place, somewher, Netherlands, 2434",,3245,325,52454,3432,243,4353,343,23,23,18'}}

到目前为止我已经尝试过了,但有点卡住了:

disc = pd.read_csv('/content/gdrive/My Drive/blank/blank.csv',delimiter='",')

csv 样本: csv sample

【问题讨论】:

  • 谁对你可怜的 csv 数据做了那个?这太可怕了?你能从源头上修复它吗?这看起来像 ',' 分隔和 '"' 引用的字符串 - 但使它成为字典的部分完全没有意义。
  • @PatrickArtner 很遗憾我不能
  • 要么我不理解问题中的某些内容,要么内置模块 csv 的默认行为已经在处理您的情况。 import csv with open('data.csv', newline='') as inFile: reader = csv.reader(inFile, delimiter=',', quotechar='"') for line in reader: # Do something with the data
  • @Pagefault 如果我使用 ',' 作为分隔符,它会将整个第一行读取为 1 列,而不是将每个项目分隔为一列
  • 您的 csv 文件的问题是每一行都以 " 开头和结尾,您可以简单地预处理文件以删除那些开头和结尾的 " 字符吗?其余的应该可以被 csv 阅读器轻松阅读。

标签: python pandas csv data-cleaning


【解决方案1】:

我使用普通函数删除两端每一行中的",并将两个""转换为单个"

这样我得到了 CSV,我可以用 read_csv() 加载它

f1 = open('Sample - Sheet1.csv')
f2 = open('temp.csv', 'w')
for row in f1:
    row = row.strip() # remove "\n"
    row = row[1:-1] # remove " on both ends
    row = row.replace('""', '"') # conver "" into "
    f2.write(row + '\n')
f2.close()
f1.close()

df = pd.read_csv('temp.csv')

print(len(df.columns))
print(df)

另一种方法:将其读取为 CSV 并保存为普通字符串

import csv

f1 = open('Sample - Sheet1.csv')
f2 = open('temp.csv', 'w')

reader = csv.reader(f1)
for row in reader:
    f2.write(row[0] + '\n')

f2.close()
f1.close()


df = pd.read_csv('temp.csv')

print(len(df.columns))
print(df)

【讨论】:

  • 谢谢,就像一个魅力,请问你为什么要去掉两端的 "?
  • 他们成对,CSV 认为它是一个长字符串,所以它将它作为单列读取。在此字符串中,CSV 使用 double "" 来告知它不是值的结束/开始,而是字符串中的普通字符。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多