1

我在这样的 CSV 文件中有一些行:

1000001234,Account Name,0,0,"3,711.32",0,0,"18,629.64","22,340.96",COD,"20,000.00",Some string,Some string 2

如果您注意到,有些数字包含在“”中,并有千位分隔符“,”。我想删除千位分隔符和双引号。对于 qoute 附件,我正在考虑使用 string.replace() 但是引号内的逗号怎么样?

在 Python 中执行此操作的最佳方法是什么?

4

6 回答 6

2

您可以简单地解析 CSV,进行必要的更改,然后重新编写。

(我没有测试过这段代码,但它应该是这样的)

import csv
reader = csv.reader(open('IN.csv', 'r'))
writer = csv.writer(open('OUT.csv', 'w')
for row in reader:
 # do stuff to the row here
 # row is just a list of items
 writer.writerow(row)
于 2009-12-08T03:48:48.287 回答
2

这里有一些正则表达式摆弄可以解决问题:

>>> import re
>>> p = re.compile('["]([^"]*)["]')
>>> x = """1000001234,Account Name,0,0,"3,711.32",0,0,"18,629.64","22,340.96",COD,"20,000.00",Some string,Some string 2"""
>>> p.sub(lambda m: m.groups()[0].replace(',',''), x)
'1000001234,Account Name,0,0,3711.32,0,0,18629.64,22340.96,COD,20000.00,Some string,Some string 2'

从引号对之间的字符串部分中删除逗号。

于 2009-12-08T04:06:17.800 回答
1

如果您只想从字符串中删除双引号和逗号,则可以进行几次替换:

s = s.replace('"','').replace(',','')

更快的方法是使用s.translate,但这需要最少的准备工作:

import string
identity = string.maketrans('', '')

...

s = s.translate(identity, '",')

这会删除任何出现的双引号或逗号,而且速度也很快。一般来说,.translate字符串对象的方法是从字符串中删除某些类型字符的最佳方法(以及可能执行一些字符到字符的翻译,但是,通过使用identity我在这里展示的翻译表,翻译部分实际上很容易被绕过)。请注意,.translateUnicode 对象(因此也适用于 Python 3 字符串)的工作方式略有不同——我给出的方法适用于普通的 Python 2 字符串对象。

于 2009-12-08T03:49:00.720 回答
1

这是我刚刚测试的东西,你可能不需要pprint,我只是想用于清晰的输出。

测试.csv

1000001234,Account Name,0,0,"3,711.32",0,0,"18,629.64","22,340.96",COD,"20,000.00",Some string,Some string 2
1000001234,Account Name,0,0,"3,711.32",0,0,"18,629.64","22,340.96",COD,"20,000.00",Some string,Some string 2

编码,使用 csv 阅读器,并将每个项目传递给 parseNum 函数以检查有效数字与否。

from pprint import pprint
import csv

def parseNum(x):
    xx=x.replace(",","")
    if not xx.replace(".","").isdigit(): return x
    return "." in xx and float(xx) or int(xx)

x=[map(parseNum,line) for line in csv.reader(open("test.csv"))]

pprint(x)

输出

[[1000001234,
  'Account Name',
  0,
  0,
  3711.3200000000002,
  0,
  0,
  18629.639999999999,
  22340.959999999999,
  'COD',
  20000.0,
  'Some string',
  'Some string 2'],
 [1000001234,
  'Account Name',
  0,
  0,
  3711.3200000000002,
  0,
  0,
  18629.639999999999,
  22340.959999999999,
  'COD',
  20000.0,
  'Some string',
  'Some string 2']]

注意:如果您需要精确的浮点数,请将浮点数替换为小数

于 2009-12-08T04:07:37.660 回答
1

使用csv模块。它具有各种常量和参数,可帮助您为正在使用的文件类型设置分隔符、引号和其他所有内容。它甚至有一个嗅探器,可以帮助您识别文件的 csv 格式。事实上,这是我发现的唯一一个可以正确、轻松地处理 csv 文件的模块。

http://docs.python.org/library/csv.html

于 2009-12-08T05:27:54.720 回答
1

您绝对应该使用该csv模块。如果使用 a csv.reader,则只有一个非常小的问题:测试字段以查看它们是否为数字,如果是则去除逗号。我已将其打包为生成器:

import csv

def read_and_fix_numbers(f):
    """Iterate over a file object that returns CSV data, stripping commas out of numbers."""
    for row in csv.reader(f):
        for field in row:
            try:
                x = float(field)
                field.replace(",", "")
            except ValueError:
                pass
            fixed.append(field)
        yield fixed

用法:

>>> data = '1000001234,Account Name,0,0,"3,711.32",0,0,"18,629.64","22,340.96",COD,"20,000.00",Some string,Some string 2'
>>> import StringIO
>>> f = StringIO.StringIO(data)
>>> for row in read_and_fix_numbers(f):
        print row
['1000001234', 'Account Name', '0', '0', '3711.32', '0', '0', '18629.64', '22340.96', 'COD', '20000.00', 'Some string', 'Some string 2']
于 2009-12-08T06:08:12.050 回答