【问题标题】:python csv, delete all commas but the first and last per linepython csv,删除所有逗号,但每行的第一个和最后一个
【发布时间】:2021-01-09 12:27:24
【问题描述】:

这应该很简单,但是...我有一个糟糕的 csv,在字段中使用了逗号。幸运的是,这个 csv 只有三列,多余的逗号都在中间列 - 所以如果我能设法删除所有逗号,但每行中的第一个和最后一个,我应该没问题。我如何让 csv 阅读器做到这一点?

【问题讨论】:

  • 保留逗号并在中间字段周围添加引号不是更好吗?
  • 如果我可以在第一个逗号和最后一个逗号之前加上引号(所以我会把中间的逗号都放在引号内),那也是完美的,是的!

标签: python csv


【解决方案1】:
with open('bad.csv') as f, open('good.csv', 'w') as fout:
    for line in f:
        first, *middle, last = line.split(',')
        fout.write(f'{first},"{",".join(middle)}",{last}')

【讨论】:

  • 我仍然需要了解您在那里所做的魔法,但它确实有效!谢谢!! :)
  • @user3647558--有关解释请查看Unpacking Operators in Python,尤其是关于*运算符的其他用途的部分。
【解决方案2】:

有时,您需要一种直通解决方案,在读取时即时修复文件,而不生成“固定”文件,例如,如果您想使用例如直接读取数据。 pandas.read_csv(...)。在这种情况下,您可以这样做:

def fix_commas(csv_file):
    with open(csv_file) as f:
        buf = f.read()
    buf = '\n'.join([re.sub(r',,+', ',', s) for s in buf.splitlines()])
    return io.StringIO(buf)

# and then
df = pd.read_csv(fix_commas(filename), ...)

例子:

txt = """
first,second,third
a,,b,bbbb
c,,,,,d,,,,,,,e
f,g,h
"""

with open('test.csv', 'w') as f:
    f.write(txt)

# now test:
df = pd.read_csv(fix_commas('test.csv'))

结果(df):

  first second third
0     a      b  bbbb
1     c      d     e
2     f      g     h

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多