2016-12-26 21 views
-1

1行に3つのアイテムを含む新しいCSVファイルを作成したいとします。 私のソースファイルが(新しい行/改行が存在しない)ようになっています行をn個のアイテムでリストをcsvファイルに変換するにはどうすればよいですか?

12123, 1324, 232324, 243443, 234, 2345, 2334, 2445, 22355, 222234, 2345 

は、今私は、CSVファイルで、このファイルを変換したいです。最初の3つの要素を取り、最初の行に入れて、新しい行、および次の3つの項目などを取る...

12123, 1324, 232324 
24343, 234, 2345 
... 

私は、Python 3.xの持つことをどのように行うことができますか?私はPythonで新たなんだし、それを得ることはありません... 私の以前の試みを:

import csv 

with open('test.csv') as f: 
    reader = csv.reader(f) 
    with open('test2.csv', 'w') as csvfile: 
     writer = csv.writer(csvfile) 
     liste = list(reader) 
     print(liste[1:2]) 

しかし、私のリストオブジェクトが一つだけ長いの項目があります。

+4

複数の問題がここにありますが、一度に一つの解決:(1)CSVを読み込む方法(2)リストの最初の3つの要素を取る方法( 3) CSVを書く方法。それぞれを単独で解決してみてください。あなたは解決するために関連するファイルや何らかのCSVを含める必要さえありません(2)。 –

+0

さて、あなたがしようとしたことを教えて始めてみませんか? – EvensF

+0

@EvensF私は最初の試みを追加しました.. – Tobias

答えて

1

あなたが言及:

私のソースファイルが(新しい行/改行が存在しない)ようになっています

12123、1324、 232324,243443,234,2345,2334,2445,22355,222234,2345

S Oこれは、行ごとに3つのグループとして書き込む、CSVの一つの長い列を読み出す:csvモジュールの正しい使用は、Python 3にnewline=''でオープンするファイルを必要とすること

import csv 

with open('test.csv',newline='') as f: 
    reader = csv.reader(f) 
    line = next(reader) # Read the one long line 

with open('test2.csv', 'w', newline='') as csvfile: 
    writer = csv.writer(csvfile) 
    for i in range(0,len(line),3): # step by threes. 
     writer.writerow(line[i:i+3]) 

ノート(「RB」をPython 2では 'wb')。

0

ファイルI/O中性溶液:

csv = """12123, 1324, 232324, 243443, 234, 2345 

2334, 2445, 22355, 222234, 2345""" # replace this with the file you read from CSV 

def sixPerLineToThreePerLine(s): 
    result = "" 
    for line in s.split("\n"): 
    sp = line.split(", ") 
    result = result + ", ".join(sp[:3]) + "\n" + ", ".join(sp[3:]) 
    return result 

print(sixPerLineToThreePerLine(csv)) # replace this with code to write to CSV 
0

これは役立つはずです。これはPython 2.7を使用して書かれていますので、3.xで問題を実行している場合は教えてください。

import csv # import the csv module you will need, if you want to avoid this you can just read it in as a text file 
output = """""" # make an output string 
num = 0 #initialize num that trakcs how many numbers have ben read 
with open('datacsv.csv', 'rb') as f: # open the input file 
    file = csv.reader(f) # initialize the file as being a csv file 
    for row in file: # for every row (you said no new lines, but just in case) 
     for data in row: # for ever entry in the row 
      if(num == 2): # if you have read in three numbers 
       num = 0 # reset num 
       output += data + "\n" # output a new line and the current number 
      else: 
       num += 1 # increment num 
       output += data + "," # add to output the data and a comma 


new = open("outputcsv.csv", "w") # create the output file 
new.write(output) # write the output data to the new file 
0

これは解決策ですが、少し長めです。基本的には、csvのすべての値をリストに書き込んだ後、リストから3つの値を削除し、値がなくなるまでcsvに書き出します。

import csv 

# just an example csv 
with open('example.csv', 'w') as csvfile: 
    # create example csv with a single row of numbers 0-19 
    spamwriter = csv.writer(csvfile) 
    spamwriter.writerow([i for i in range(20)]) 

# open file for reading, append values to list 
l = [] 
with open('example.csv') as csvfile: 
    # read the example file into a list 
    reader = csv.reader(csvfile) 
    for row in reader: 
     for val in row: 
      l.append(val) 


# write to the original file with 3 values per line 
with open('example.csv', 'w') as csvfile: 
    spamwriter = csv.writer(csvfile) 
    while l: 
     try: 
      # write to file 3 values at a time 
      spamwriter.writerow(l[:3]) 
      l = l[3:] 
     except: 
      # add last bit of file, if file doesn't devide evenly by 3 
      spamwriter.writerow(l) 
      break 

私はそれが非常に簡単にそれをCSVを操作するために見つけるPandas をチェックアウトしてお勧めしますが、それは標準ライブラリではありません。

0

ファイルからデータを読み込み、個々の要素に分割します。個々の要素に入れたら、それらを3つのグループに分けて出力ファイルに書き込むことができます。

このような何かが動作するはず

def read_data(file_path): 
    with open(file_path, 'r') as fh: 
     elements = fh.read() 
    data = [element.strip() for element in elements.split(',')] 
    return data 

def group(data): 
    grouped = [', '.join(data[n:n+3]) for n in range(0, len(data), 3)] 
    return grouped 

def write(data, output): 
    with open(output, 'w') as fh: 
     fh.writelines(data) 

def main(): 
    data = read('test.csv') 
    data = group(data) 
    write(data, 'test2.csv') 
+0

私は 'read_data()'では 'fh'として' open(file_path、 'r')を使った方がいいと思います。 – EvensF

+0

ああ、そうです。ありがとうございました。 – Batman

0

私はあなたが望んでいだと思うのショートプログラムを書いた:それは、読者のファイルからすべての行を読み込み、そしてちょうど3 :)

import csv 

def main(): 

    with open('ex.csv', 'rb') as f: 
    reader = csv.reader(f) 
    with open('ex2.csv', 'wb') as csvfile: 
     writer = csv.writer(csvfile) 
     pass_on = [] 

     for row in reader: 
      #print row 

      for c in xrange(0, len(row)): # passing on objects after count of 3 
       if row[c]: 
        pass_on.append(row[c]) 


     print pass_on 

     while pass_on: 

      writer.writerow(pass_on[:3]) 
      pass_on = pass_on[3:] 



    print "done" 

if __name__ == '__main__': 
    main() 
0

でライターファイル3に挿入して

csvモジュールなしの4ラインソリューション:

with open('oneline_numbers.csv') as fobj_in, open('three_numbers.csv', 'w') as fobj_out: 
    numbers = iter(entry.strip() for entry in next((fobj_in)).split(',')) 
    for line in zip(*[numbers] * 3): 
     fobj_out.write(', '.join(line) + '\n') 
関連する問題