可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have several CSV files that look like this:
Input
Name Code
blackberry 1
wineberry 2
rasberry 1
blueberry 1
mulberry 2
I would like to add a new column to all CSV files so that it would look like this:
Output
Name Code Berry
blackberry 1 blackberry
wineberry 2 wineberry
rasberry 1 rasberry
blueberry 1 blueberry
mulberry 2 mulberry
The script I have so far is this:
import csv
with open(input.csv,\'r\') as csvinput:
with open(output.csv, \'w\') as csvoutput:
writer = csv.writer(csvoutput)
for row in csv.reader(csvinput):
writer.writerow(row+[\'Berry\'])
(Python 3.2)
But in the output, the script skips every line and the new column has only Berry in it:
Output
Name Code Berry
blackberry 1 Berry
wineberry 2 Berry
rasberry 1 Berry
blueberry 1 Berry
mulberry 2 Berry
回答1:
This should give you an idea of what to do:
>>> v = open(\'C:/test/test.csv\')
>>> r = csv.reader(v)
>>> row0 = r.next()
>>> row0.append(\'berry\')
>>> print row0
[\'Name\', \'Code\', \'berry\']
>>> for item in r:
... item.append(item[0])
... print item
...
[\'blackberry\', \'1\', \'blackberry\']
[\'wineberry\', \'2\', \'wineberry\']
[\'rasberry\', \'1\', \'rasberry\']
[\'blueberry\', \'1\', \'blueberry\']
[\'mulberry\', \'2\', \'mulberry\']
>>>
Edit, note in py3k you must use next(r)
Thanks for accepting the answer. Here you have a bonus (your working script):
import csv
with open(\'C:/test/test.csv\',\'r\') as csvinput:
with open(\'C:/test/output.csv\', \'w\') as csvoutput:
writer = csv.writer(csvoutput, lineterminator=\'\\n\')
reader = csv.reader(csvinput)
all = []
row = next(reader)
row.append(\'Berry\')
all.append(row)
for row in reader:
row.append(row[0])
all.append(row)
writer.writerows(all)
Please note
- the
lineterminator
parameter in csv.writer
. By default it is
set to \'\\r\\n\'
and this is why you have double spacing.
- the use of a list to append all the lines and to write them in
one shot with
writerows
. If your file is very, very big this
probably is not a good idea (RAM) but for normal files I think it is
faster because there is less I/O.
As indicated in the comments to this post, note that instead of
nesting the two with
statements, you can do it in the same line:
with open(\'C:/test/test.csv\',\'r\') as csvinput, open(\'C:/test/output.csv\', \'w\') as csvoutput:
回答2:
I\'m surprised no one suggested Pandas. Although using a set of dependencies like Pandas might seem more heavy-handed than is necessary for such an easy task, it produces a very short script and Pandas is a great library for doing all sorts of CSV (and really all data types) data manipulation. Can\'t argue with 4 lines of code:
import pandas as pd
csv_input = pd.read_csv(\'input.csv\')
csv_input[\'Berries\'] = csv_input[\'Name\']
csv_input.to_csv(\'output.csv\', index=False)
Check out Pandas Website for more information!
Contents of output.csv
:
Name,Code,Berries
blackberry,1,blackberry
wineberry,2,wineberry
rasberry,1,rasberry
blueberry,1,blueberry
mulberry,2,mulberry
回答3:
import csv
with open(\'input.csv\',\'r\') as csvinput:
with open(\'output.csv\', \'w\') as csvoutput:
writer = csv.writer(csvoutput)
for row in csv.reader(csvinput):
if row[0] == \"Name\":
writer.writerow(row+[\"Berry\"])
else:
writer.writerow(row+[row[0]])
Maybe something like that is what you intended?
Also, csv stands for comma separated values. So, you kind of need commas to separate your values like this I think:
Name,Code
blackberry,1
wineberry,2
rasberry,1
blueberry,1
mulberry,2
回答4:
I used pandas and it worked well...
While I was using it, I had to open a file and add some random columns to it and then save back to same file only.
This code adds multiple column entries, you may edit as much you need.
import pandas as pd
csv_input = pd.read_csv(\'testcase.csv\') #reading my csv file
csv_input[\'Phone1\'] = csv_input[\'Name\'] #this would also copy the cell value
csv_input[\'Phone2\'] = csv_input[\'Name\']
csv_input[\'Phone3\'] = csv_input[\'Name\']
csv_input[\'Phone4\'] = csv_input[\'Name\']
csv_input[\'Phone5\'] = csv_input[\'Name\']
csv_input[\'Country\'] = csv_input[\'Name\']
csv_input[\'Website\'] = csv_input[\'Name\']
csv_input.to_csv(\'testcase.csv\', index=False) #this writes back to your file
If you want that cell value doesn\'t gets copy, so first of all create a empty Column in your csv file manually, like you named it as Hours
then, Now for this you can add this line in above code,
csv_input[\'New Value\'] = csv_input[\'Hours\']
or simply we can, without adding the manual column, we can
csv_input[\'New Value\'] = \'\' #simple and easy
I Hope it helps.
回答5:
I don\'t see where you\'re adding the new column, but try this:
import csv
i = 0
Berry = open(\"newcolumn.csv\",\"r\").readlines()
with open(input.csv,\'r\') as csvinput:
with open(output.csv, \'w\') as csvoutput:
writer = csv.writer(csvoutput)
for row in csv.reader(csvinput):
writer.writerow(row+\",\"+Berry[i])
i++
回答6:
This code will suffice your request and I have tested on the sample code.
import csv
with open(in_path, \'r\') as f_in, open(out_path, \'w\') as f_out:
csv_reader = csv.reader(f_in, delimiter=\';\')
writer = csv.writer(f_out)
for row in csv_reader:
writer.writerow(row + [row[0]]