1

こんにちは、ここで小さな問題があります。

このような数字のテキストファイルがあります

2.131583
2.058964
6.866568
0.996470
6.424396
0.996004
6.421990

そして

fList = [s.strip() for s in open('out.txt').readlines()]
outStr = ''
for i in fList:
      outStr += (i+',')
f = open('text_to_csv.csv', 'w')
f.write(outStr.strip())
f.close()

CSV を生成することができ、すべてのデータがその中に保存されますが、すべて 1 行にまとめられます。それらを2列に並べたいと思います。

CSVをこのようにする簡単な追加はありますか?

2.131583 2.058964
6.866568 0.996470
6.424396 0.996004
4

6 に答える 6

2

より良い方法は csv モジュールを使用することです。次のように書くことができます

import csv

with open('text_to_csv.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile, delimiter=',',quoting=csv.QUOTE_MINIMAL)
    for i in range(0, len(fList), 2):
        writer.writerow(fList[i:i+2])
于 2013-10-30T17:32:09.717 に答える
1
fList = [s.strip() for s in open('out.txt').readlines()]
outStr = ''
count = 0
for i in fList:
      outStr += (i+',')
      if count % 2 == 0: # You can replace 2 with what ever number you of columns you need
          outStr += ('\r\n') # Make the return correct for your system
      count += 1
f = open('text_to_csv.csv', 'w')
f.write(outStr.strip())
f.close()
于 2013-10-30T17:13:20.260 に答える
0

(ファイルを読み取って) メモリにリストがある場合は、リストを必要な形式に再フォーマットするだけです。

input='''\
2.131583
2.058964
6.866568
0.996470
6.424396
0.996004
6.421990'''    

cols=2

data=input.split()       # proxy for a file
print data
print '==='
for li in [data[i:i+cols] for i in range(0,len(data),cols)]:
    print li

版画:

['2.131583', '2.058964', '6.866568', '0.996470', '6.424396', '0.996004', '6.421990']
===
['2.131583', '2.058964']
['6.866568', '0.996470']
['6.424396', '0.996004']
['6.421990']

または、一度に N 個のファイルを読み取るイディオムを使用します。

import itertools
cols=2
with open('/tmp/nums.txt') as fin:
    for li in itertools.izip_longest(*[fin]*cols):
        print li  
# prints
('2.131583\n', '2.058964\n')
('6.866568\n', '0.996470\n')
('6.424396\n', '0.996004\n')
('6.421990', None)

ファイルフィルターのタイプが必要な場合は、1つのイテレーターインと1つのイテレーターアウトに組み合わせることができます:

import itertools
cols=2
with open('/tmp/nums.txt') as fin, open('/tmp/nout.txt','w') as fout:
    for li in itertools.izip_longest(*[fin]*cols):
        fout.write('\t'.join(e.strip() for e in li if e)+'\n')

出力ファイルは次のようになります。

2.131583    2.058964
6.866568    0.996470
6.424396    0.996004
6.421990

の出力のみを書きたい場合は、数値の完全なセット、つまり、ファイルの末尾にある残りの数値がcols全長よりも短い場合があります。

import itertools
cols=2
# last number '6.421990' not included since izip is used instead of izip_longest
with open('/tmp/nums.txt') as fin, open('/tmp/nout.txt','w') as fout:
    for li in itertools.izip(*[fin]*cols):
        fout.write('\t'.join(e.strip() for e in li)+'\n') 

次に、出力ファイルは次のとおりです。

2.131583    2.058964
6.866568    0.996470
6.424396    0.996004
于 2013-10-30T17:15:45.367 に答える
0

このようなもの:

with open('out.txt', 'r') as fList, open('text_to_csv.csv', 'w') as f:
    i = 0
    for line in fList:
        f.write(line)
        f.write('\n' if i% 2 == 0 else '\t')`
于 2013-10-30T17:17:03.313 に答える
0

何を言っているのかよくわかりませんが、期待される出力は次のとおりだと思います。

2.131583,2.058964,
6.866568,0.996470,
6.424396,0.996004,
6.421990

これのための私のコード:

with open('out.txt', 'r') as fif, open('text_to_csv.csv', 'w') as fof:
    fList = ','.join([v.strip() if i % 2 else '\n'+v.strip()
                      for i, v in enumerate(fif.readlines())])[1:]
    fof.write(fList)


興味深い点:

ファイルの末尾にある「,」を取り除きたい場合は、join()関数を介してリストを連結するだけです。

flat_string = ','.join([item1,...,])

リスト内の奇数項目の先頭の改行については、列挙しました。

index, value enumerate([item1,...,])

modulo-operator を介して奇数項目を見つけますindex % 2

「インラインif」を使用すると、これをその場で確認できます。

少なくとも、文字列の先頭にある冗長な改行を除外します[1:]

于 2013-10-30T17:50:07.667 に答える
0

元のファイルのエントリを新しいリストに保存するのではなく、出力ファイルだけが必要な場合は、次のようにすることもできます。

fList = [s.strip() for s in open('out.txt').readlines()]
f = open('text_to_csv.csv', 'w')
for i in range(0,len(fList)-1,2):
    f.write(fList[i] + "," + fList[i+1] + "\n")

f.close()
于 2013-10-30T17:26:50.933 に答える