0

既存のデータの後に新しい列を CSV ファイルに挿入しようとしています。たとえば、私の CSV ファイルには現在次のものが含まれています。

   Heading 1     Heading 2
   1 
   1
   0
   2
   1
   0

次の形式の整数のリストがあります。

 [1,0,1,2,1,2,1,1]

このリストを「ヘッダー 2」の下の CSV ファイルに挿入するにはどうすればよいですか?

これまでのところ、私が達成できたのは、現在のデータの下に新しい整数のリストを追加することだけです。次に例を示します。

   Heading 1     Heading 2
   1 
   1
   0
   2
   1
   0
   1
   0
   1
   2
   1
   2
   1
   1

コードの使用:

 #Open CSV file
 with open('C:\Data.csv','wb') as g:
            #New writer
    gw = csv.writer(g)
            #Add headings
    gw.writerow(["Heading 1","Heading 2"])
            #Write First list of data to heading 1 (orgList)
    gw.writerows([orgList[item]] for item in column)
            #For each value in new integer list, add row to CSV
    for val in newList:
        gw.writerow([val])
4

3 に答える 3

1

バグを修正するコードは次のとおりです。

import csv
from itertools import izip_longest


# Creating a CSV file
with open(r'Data.csv','wb') as f:
    fw = csv.writer(f)
    fw.writerows( (('Heading 1', 'Heading 2'),
                   ('1'),
                   ('1'),
                   ('0'),
                   ('2'),
                   ('1'),
                   ('0'))   )


print "The CSV file at start, read by a csv.reader :\n"
with open(r'Data.csv','rb') as f:
    fr = csv.reader(f)
    print '\n'.join(map(repr,fr))


print '\n------------------------------------------'
newdata = [10,0,10,20,10,20,10,10]

with open(r'Data.csv','rb') as f:
    fr = csv.reader(f)
    newrows = [fr.next()]
    newrows += (a+[b] for a,b in izip_longest(fr, newdata,
                                              fillvalue=[0]))

print 'newrows\n',newrows

with open(r'Data.csv', 'wb') as f:
     csv.writer(f).writerows(newrows)
print '------------------------------------------\n'


print "The new CSV file created, read by a csv.reader :\n"
with open(r'Data.csv','rb') as f:
    fr = csv.reader(f)
    print '\n'.join(map(repr,fr))

次のように表示されます。

The CSV file at start, read by a csv.reader :

['Heading 1', 'Heading 2']
['1']
['1']
['0']
['2']
['1']
['0']

------------------------------------------
newrows
[['Heading 1', 'Heading 2'], ['1', 10], ['1', 0], ['0', 10], ['2', 20], ['1', 10], ['0', 20], [0, 10], [0, 10]]
------------------------------------------

The new CSV file created, read by a csv.reader :

['Heading 1', 'Heading 2']
['1', '10']
['1', '0']
['0', '10']
['2', '20']
['1', '10']
['0', '20']
['0', '10']
['0', '10']

編集

さらに凝縮

import csv
from itertools import izip_longest
from os import remove,rename

# Creating a CSV file
with open(r'Data.csv','wb') as f:
    fw = csv.writer(f)
    fw.writerows( (('Heading 1', 'Heading 2'),
                   ('1'),
                   ('1'),
                   ('0'),
                   ('2'),
                   ('1'),
                   ('0'))   )

print "The CSV file at start, read by a csv.reader :\n"
with open(r'Data.csv','rb') as f:
    print '\n'.join(map(repr,csv.reader(f)))


#------------------------------------------
newdata = [10,0,10,20,10,20,10,10]

with open(r'Data.csv','rb') as f, open(r'newData.csv','wb') as g:
    fr = csv.reader(f)
    gw = csv.writer(g)
    gw.writerow(fr.next())
    gw.writerows( a+[b] for a,b in izip_longest(fr, newdata,
                                                fillvalue=[0]) )
remove (r'Data.csv')
rename (r'newData.csv',r'Data.csv')

#------------------------------------------

print "The new CSV file created, read by a csv.reader :\n"
with open(r'Data.csv','rb') as f:
    print '\n'.join(map(repr,csv.reader(f)))
于 2013-02-09T23:18:38.820 に答える
1

2つの関連する問題があります。

  • 読んでいるのと同じファイルに書き込む
  • 新しいデータと古いデータの両方を含む新しい行ではなく、新しいデータのみを出力します。

データをメモリに読み込むことから始めます。

with open(r'C:\Data.csv','rb') as f:
    rows = list(csv.reader(f))

次に、タプルのリストを新しいデータを持つタプルの新しいリストに変換します。

newdata = [1,0,1,2,1,2,1,1]
newrows = [rows[0]]            # keep the current two headers
newrows += izip_longest(rows[1:], newdata, fillvalue=0)

最後に、データをディスクに書き戻します。

with open(r'C:\Data.csv', 'wb') as f:
     csv.writer(f).writerows(newrows)
于 2013-02-09T16:52:14.457 に答える
1

未テスト:

import csv
from itertools import izip_longest

some_ints = [1,0,1,2,1,2,1,1]

with open('input') as fin, open('output', 'w') as fout:
    csvin = csv.reader(fin)
    csvout = csv.writer(fout)
    cols = izip_longest(csvin, some_ints, fillvalue='')
    csvout.writerows(cols)
于 2013-02-09T16:22:18.357 に答える