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

csvモジュールを使用します。作業しているファイルの種類に合わせて区切り記号、引用符、およびその他すべてを設定するのに役立つ、あらゆる種類の定数とパラメーターがあります。ファイルの csv 形式を識別するのに役立つ Sniffer もあります。実際、これは csv ファイルを適切かつ簡単に操作できる唯一のモジュールです。

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

于 2009-12-08T05:27:54.720 に答える
1

文字列から二重引用符とコンマを削除するだけの場合は、いくつかの置換でそれができます。

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

より速い方法は を使用するs.translateことですが、最低限の準備が必要です:

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

...

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

これにより、二重引用符またはコンマの発生が削除され、非常に高速になります。一般に、.translate文字列オブジェクトのメソッドは、特定の種類の文字を文字列から削除するための最良の方法です (文字から文字への変換を実行することもできますが、identityここで示したような変換テーブルを使用することで、変換部分は実際には簡単にバイパスされる可能性があります)。Unicode オブジェクト (したがって Python 3 文字列も同様) では動作が少し異なることに注意してください。ここで.translateは、プレーンな Python 2 文字列オブジェクトに適したアプローチを示しています。

于 2009-12-08T03:49:00.720 に答える
1

これは私がテストしたばかりのものです.pprintは必要ないかもしれません.明確な出力のために使用したいだけです.

test.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']]

注: 浮動小数点数に十分な精度が必要な場合は、floatDecimalに置き換えます。

于 2009-12-08T04:07:37.660 に答える
1

モジュールは絶対に使用する必要がありcsvます。を使用するcsv.readerと、非常に小さな問題が 1 つだけ発生します。フィールドをテストして数値であるかどうかを確認し、数値である場合はコンマを削除します。ジェネレーターとしてパッケージ化しました:

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 に答える