2017-10-31 3 views
1

私は前に書いたcsvの行を読み込もうとしています。 書かれた行は、次のようになります。['New York', '(30,40)'] など:['New York', '(30,40)'](タプルを文字列に変換)Pythonのcsvからタプルを読む

intを操作するためにタプルから各項目を読み込む必要がありますが、文字列のように読み込まれた場合、私はこのようなことをします:tuple[0]、私が得るものは'(' - 最初です

tuple-列の文字は、たぶんこれは実際にはこの方法で私が書くと行を読み取る方法についての質問です:

def writeCSV(data,name): 
    fileName = name+'.csv' 
    with open(fileName, 'a') as csvfile: 
    writer = csv.writer(csvfile, delimiter=',') 
    writer.writerow(data) 

def readCSV(filename): 
    allRows = [] 
    with open(filename, 'rb') as f: 
     reader = csv.reader(f, delimiter=' ') 
     for row in reader: 
      allRows.append(row) 
return allRows 

私が欲しいものは、行のためにそのタプルを読み取ることではありません文字列のようですが、後の各項目とを操作するタプルのようです。 可能ですか?

+0

'ast.literal_eval'を使用して、文字列をタプルに解析します。 –

+0

初心者のためにcsv行にタプルを書き込まないでください。それぞれの値を1行に書く –

答えて

0

あなたはあなたのようにタプルの文字列にast.literal_eval()を使用する必要があります。現在あなたはインデックス1でファイルを読み込んだ後に得たリストは、タプル形式の有効な文字列を保持しているので

>>> my_file_line = ['New York', '(30,40)'] 
>>> import ast 
>>> my_tuple = ast.literal_eval(my_file_line[1]) 
>>> my_tuple[0] 
30 

ast.literal_evalは、タプル文字列をtupleオブジェクトに変換し、インデックスに基づいてタプルにアクセスできます。

+1

それは仕事です!これが私の必要なものですが、@ Jean-FrançoisFabreの書き方を改善するために注意しています。どうもありがとうございます。 – CodePathLvl

+0

@CodePathLvl ypuが答えを見つけたら、答えの左側にある上向きの矢印を押してupvoteし、矢印の下にあるgrep "tick"アイコンを押してマークを受け付けます。答えを受け入れると、ティックは緑色に変わります。 –

0

あなたは、なぜ最初からそれをしない、ファイルを自分で作成しているので、:

import csv 

data = ['New York', (30,40)] 
with open("out.csv","w",newline="") as f: 
    cw=csv.writer(f) 
    cw.writerow(data) # wrong 
    cw.writerow(data[:1]+list(data[1])) # okay 

最初の行はdataの各項目を書き込みますがstrとして各項目を変換しようとします。 tupleが変換され、別の形式を選択するとこれを回避できます。その後、それを評価する必要性を説明し

New York,"(30, 40)" 

が第2書き込み線は、3つの要素(現在は3列)を書き込み、その場合に

New York,30,40 

(とにかくstrに変換さint部分を除く)のデータを保持し、単純な文字列は、整数します行の変換はジョブを行います。

csvは、混合データをシリアル化する最良の方法ではありません。そのためにはjsonを使用してください。

関連する問題