2011-10-21 24 views
14

現在、Excelで開いたときに合計5つの列を持つCSVファイルがあります。列Aと列Cのみが私にとって重要であり、残りの列のデータは無関係です。PythonでCSV /タブ区切りのtxtファイルを解析する

8の行から7の倍数(つまり8,15,22,29,36など)で作業していますが、これらのフィールドの情報を含むPython 2.7の辞書を作成したいと考えています。列Aのデータはキー(6桁の整数)になり、列Cのデータはキーのそれぞれの値になります。 「上を1として

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」はそれぞれのデータであり、次に私のキーである「2938495」とそれぞれの値である「1538」とジャンプして、辞書に別の項目を追加します。

提案がありますか?ソースファイルは、エントリがタブ区切りの.txtファイルです。 おかげで

明確化:

だけ明確にする、これまでのところ、私は以下試してみました: -

import csv 

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

上記単に一度に行けれども、すべてのコンテンツを出力します。私は "読者の行(7)"を試しましたが、これはエラーを返しました。私はそれを調査し、下記で行くを持っていたが、それはどちらもうまくいきませんでした:リストのリストにテキストを回して

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 
+0

@jdigital - 私は – thefragileomen

+0

は「8行目から始まる」これまでに試したものを含むように編集された元の質問には「A7」、「6桁の整数」と一致していません"DDEFEEF"と一致しません - あなたの質問を編集してください。 –

+0

@ John Machin - A7はデータを抽出したいセルではなく、A8です。 A7のデータは、単にCSVファイルに他のデータがどのようなものであるかの例を示しています。 6桁の整数ではないので、無視されます。ありがとうございました – thefragileomen

答えて

43

開始。それはパース一部の世話をします。

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 
... 
+2

forループと一緒に素晴らしい作業をしました。お返事ありがとう – thefragileomen

2

ファイルが大きい場合は、一度に完全にメモリにロードしたくないかもしれません。このアプローチはそれを回避します。 (もちろん、それから辞書を作ることはまだいくつかの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

+0

ありがとうございます。私は上記の実装を試み、最後の行に "ValueError"を取得しました - "辞書更新シーケンス要素#0には長さ1があり、2が必要です"。助言がありますか? – thefragileomen

+0

@ thefragileomenは、3段階のブレースを必要としない、より読みやすい方法で編集されています。 – kojiro

3

を提示しましたが、他の解決策は何も問題はありませんが、Pythonの優れたライブラリパンダを使用することで、ソリューションを簡素化し、大きく拡大することができます。

パンダはPythonでデータを扱うためのライブラリであり、多くのデータサイエンティストに好まれています。

パンダには、ファイルの読み込みと解析のための簡略化された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") 
関連する問題