2

csv module以前に を使用したことはありませんpythonが、私のニーズに使用するのに最適なツールのようです。

私が直面している問題は、私のcsv-file見た目が少し奇妙であることです。(最初は気づきにくかった)

私が何を意味するかについては、以下の例を参照してください。

A|B|C|D|x|F|G|x|H
1||2||3|4||5|6
1||2||3|4||5|6
1||2||3|4||5|6
1||2||3|4||5|6

上記のいくつかのインデックス ( column-xなど) は、 DxおよびGxとして読み取る必要があります。D 列G 列は空の列です。

したがって、csv がヘッダーを処理しているときに、 DxGxなどのヘッダーを作成し、 D列とG列を無視して、代わりにx 列から値を取得する必要があります。

(最初に次のコードでファイルをそのまま読み込んで後処理しようとしましたが、列名xは常に同じであり、csv.DictReader繰り返しの列名を破棄するように見えるため、不可能です)

with open('myCSV.log') as csvFile:
    reader = csv.DictReader(csvFile, dialect='pipes')
    for row in reader:
        print row

これはdialect、または他の凝った設定方法で実現できますcsv-moduleか?それとも自分で解析する必要がありますか?

4

4 に答える 4

1

パンダを使う:

import pandas as pd
print pd.read_csv('test.csv',sep='|')

アウト:

   A   B  C   D  x  F   G  x.1  H
0  1 NaN  2 NaN  3  4 NaN    5  6
1  1 NaN  2 NaN  3  4 NaN    5  6
2  1 NaN  2 NaN  3  4 NaN    5  6
3  1 NaN  2 NaN  3  4 NaN    5  6

必要に応じて、to_dict()メソッドを使用して辞書に変換できます。

{'A': {0: 1, 1: 1, 2: 1, 3: 1},
 'B': {0: nan, 1: nan, 2: nan, 3: nan},
 'C': {0: 2, 1: 2, 2: 2, 3: 2},
 'D': {0: nan, 1: nan, 2: nan, 3: nan},
 'F': {0: 4, 1: 4, 2: 4, 3: 4},
 'G': {0: nan, 1: nan, 2: nan, 3: nan},
 'H': {0: 6, 1: 6, 2: 6, 3: 6},
 'x': {0: 3, 1: 3, 2: 3, 3: 3},
 'x.1': {0: 5, 1: 5, 2: 5, 3: 5}}

編集:列に特定の名前が必要な場合は、これを行うことができます:

import pandas as pd
df = pd.read_csv('test.csv',sep='|')
df.columns = [df.columns[index-1]+'x' if 'x' in name 
              else name for index,name in enumerate(df.columns)]
print df

   A   B  C   D  Dx  F   G  Gx  H
0  1 NaN  2 NaN   3  4 NaN   5  6
1  1 NaN  2 NaN   3  4 NaN   5  6
2  1 NaN  2 NaN   3  4 NaN   5  6
3  1 NaN  2 NaN   3  4 NaN   5  6

空の列を失いたい場合:

print df.dropna(axis=1,how='all')

   A  C  Dx  F  Gx  H
0  1  2   3  4   5  6
1  1  2   3  4   5  6
2  1  2   3  4   5  6
3  1  2   3  4   5  6
于 2013-01-17T09:28:03.977 に答える
0

ファイルを読んで後処理するのは確かに道だと思います。使用しないでくださいDictReader

with open('myCSV.log') as csvFile:
    for row in csv.reader(csvFile, delimiter='|'):
        print row


['A', 'B', 'C', 'D', 'x', 'F', 'G', 'x', 'H']
['1', '', '2', '', '3', '4', '', '5', '6']
['1', '', '2', '', '3', '4', '', '5', '6']
['1', '', '2', '', '3', '4', '', '5', '6']
['1', '', '2', '', '3', '4', '', '5', '6']
于 2013-01-17T09:27:00.510 に答える
0
from StringIO import StringIO
import csv

with open('test.csv') as f:
    lines = f.read().split('\n')
    line_0 = lines[0].split('|')
    lines[0] = '|'.join(line_0[i-1] if 'x' in n else n for i,n in 
                                               enumerate(line_0))

    reader = csv.DictReader(StringIO('\n'.join(lines)),delimiter = '|' )
    for row in reader:
        print row

アウト:

{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
于 2013-01-17T10:38:34.907 に答える
0

9 つのヘッダーと 9 つの列があり、列ヘッダーが 2 重になっていることを除けば、.csv に問題はありません。これらの名前を変更するには、DictReader のフィールド名をオーバーライドできます。また、列「D」の名前を「Dx」に変更する場合は、このパラメーターを使用して実行できます。.

import csv
from pprint import pprint
with open('testfile.csv') as csvFile:
reader = csv.DictReader(csvFile, fieldnames = ['A','B','C','meh','Dx','F','moe','Gx','H'], delimiter = '|'  )
for row in reader:
        pprint(row)

ここで方言を使用する必要はないようです。これは私のテスト出力で、最初の行がヘッダーになっています。

{'A': 'A',
 'B': 'B',
 'C': 'C',
 'Dx': 'x',
 'F': 'F',
 'Gx': 'x',
 'H': 'H',
 'meh': 'D',
 'moe': 'G'}
{'A': '1',
 'B': '',
 'C': '2',
 'Dx': '3',
 'F': '4',
 'Gx': '5',
 'H': '6',
 'meh': '',
 'moe': ''}
 ....
于 2013-01-17T09:36:52.867 に答える