web-dev-qa-db-ja.com

Pythonを使用したCSV /タブ区切りテキストファイルの解析

現在、Excelで開いたときに合計5列のCSVファイルがあります。私にとって重要なのは列AとCだけで、残りの列のデータは無関係です。

8行目から開始し、7の倍数(つまり、8、15、22、29、36など)で作業し、Python 2.7で辞書を作成しようとしています。これらのフィールドからの情報。列Aのデータがキー(6桁の整数)になり、列Cのデータがキーのそれぞれの値になります。これを以下で強調表示しようとしましたが、フォーマットは異なります最高の:-

    A        B      C          D
1                           CDCDCDCD  
2                           VDDBDDB
3
4
5
6
7  DDEFEEF                   FEFEFEFE
8  123456         JONES
9
10
11
12
13
14
15 293849         SMITH

上記のように、辞書のキーとしてA7(DDEFEEF)から値を抽出し、それぞれのデータである「FEFEFEFE」を検索してから、辞書に別のエントリを追加します。キーと「スミス」はそれぞれの値です。

助言がありますか?ソースファイルは、エントリがタブ区切りの.txtファイルです。ありがとう

明確化:

明確にするために、これまでのところ、私は以下を試しました:-

import csv

mydict = {:}
f = open("myfile", 'rt')
reader = csv.reader(f)
    for row in reader:
        print row

上記は、一度に1行ずつすべてのコンテンツを出力します。 「for row(7)in reader」を試しましたが、これはエラーを返しました。その後、私はそれを調査し、以下で試してみましたが、どちらも機能しませんでした:

import csv
from itertools import islice

entries = csv.reader(open("myfile", 'rb'))
mydict = {'key' : 'value'}

for i in xrange(6):
    mydict['i(0)] = 'I(2)    # integers representing columns
    range = islice(entries,6)
    for entry in range:
        mydict[entries(0) = entries(2)] # integers representing columns
21
thefragileomen

テキストをリストのリストに変えることから始めます。これにより、解析部分が処理されます。

lol = list(csv.reader(open('text.txt', 'rb'), delimiter='\t'))

残りは、インデックス付きルックアップで実行できます。

d = dict()
key = lol[6][0]      # cell A7
value = lol[6][3]    # cell D7
d[key] = value       # add the entry to the dictionary
 ...
52

提示されている他のソリューションには何も問題はありませんが、Pythonの優れたライブラリパンダを使用することで、ソリューションを簡素化し、大幅にエスカレートできます。

Pandasは、多くのデータサイエンティストが好むPythonでデータを処理するためのライブラリです。

Pandasには、ファイルの読み取りと解析を行うための単純化されたCSVインターフェイスがあります。これを使用して、それぞれがファイルの1行を含む辞書のリストを返すことができます。キーは列名になり、値は各セルの値になります。

あなたの場合:

    import pandas

    def create_dictionary(filename):
        my_data = pandas.DataFrame.from_csv(filename, sep='\t', index_col=False)
        # Here you can delete the dataframe collumns you dont want!
        del my_data['B']
        del my_data['D']
        # ...
        # Now you transform the DataFrame to a list of dictionaries
        list_of_dicts = [item for item in my_data.T.to_dict().values()]
        return list_of_dicts

# Usage:
x = create_dictionary("myfile.csv")
7
José Fonseca

ファイルが大きい場合、一度に完全にメモリにロードしたくない場合があります。このアプローチはそれを回避します。 (もちろん、それから辞書を作成すると、RAMを占有する可能性がありますが、元のファイルよりも小さいことが保証されています。)

my_dict = {}
for i, line in enumerate(file):
    if (i - 8) % 7:
        continue
    k, v = line.split("\t")[:3:2]
    my_dict[k] = v

編集:以前からextendをどこで手に入れたかわからない。私はupdateを意味しました

3
kojiro