向现有CSV文件添加新列

9 投票
4 回答
27043 浏览
提问于 2025-04-18 06:40

我有一个包含5列的csv文件,现在我想在第6列添加一些数据。这些数据我已经放在一个数组里。

目前,我的代码只能把我想放在第6列的数据添加到csv文件中所有已有数据的后面。

比如说,我有:

wind, site, date, time, value
10, 01, 01-01-2013, 00:00, 5.1
89.6    ---> this is the value I want to add in a 6th column but it puts it after all the  data from the csv file

这是我正在使用的代码:

csvfile = 'filename'
with open(csvfile, 'a') as output:
    writer = csv.writer(output, lineterminator='\n')
    for val in data:
        writer.writerow([val])

我以为用'a'可以把数据添加到新的一列,但实际上它只是把数据放在了所有其他数据的下面……我不知道该怎么办!

4 个回答

-1

打开文件的追加模式是为了在文件的末尾添加数据。你需要做的就是让你的文件写入可以随机访问。为此,你需要使用 seek() 方法。

你可以在这里看到一个例子:http://www.tutorialspoint.com/python/file_seek.htm

或者你可以在这里阅读 Python 的文档:https://docs.python.org/2.4/lib/bltin-file-objects.html,不过这个文档可能不是特别有用。

如果你想在某一列的末尾添加内容,你可能需要先打开文件,读取一行来确定它的长度,然后再移动到文件的末尾。

2

我们有一个CSV文件,叫做data.csv,里面的内容是:

#data.csv
1,Joi,Python
2,Mark,Laravel
3,Elon,Wordpress
4,Emily,PHP
5,Sam,HTML

现在我们想在这个CSV文件中添加一列,并且这一列的所有条目都应该包含相同的值,也就是某些文本

示例

from csv import writer
from csv import reader
new_column_text = 'Something text'

with open('data.csv', 'r') as read_object, \
    open('data_output.csv', 'w', newline='') as write_object:
    csv_reader = reader(read_object)
    csv_writer = writer(write_object)
    for row in csv_reader:
        row.append(new_column_text)
        csv_writer.writerow(row)

输出结果

#data_output.csv
1,Joi,Python,Something text
2,Mark,Laravel,Something text
3,Elon,Wordpress,Something text
4,Emily,PHP,Something text
5,Sam,HTML,Something text
2

csv模块不支持直接写入或添加列。所以你能做的就是:从一个文件读取数据,添加第六列的数据,然后写入到另一个文件。下面是示例代码:

with open('in.txt') as fin, open('out.txt', 'w') as fout:
        index = 0
        for line in fin:
            fout.write(line.replace('\n', ', ' + str(data[index]) + '\n'))
            index += 1

data是一个整数列表。

我在Python中测试了这些代码,运行得很好。

9

追加写入是把数据加到文件的末尾,而不是每一行的末尾。

相反,你应该创建一个新文件,然后把新的值加到每一行后面。

csvfile = 'filename'
with open(csvfile, 'r') as fin, open('new_'+csvfile, 'w') as fout:
    reader = csv.reader(fin, newline='', lineterminator='\n')
    writer = csv.writer(fout, newline='', lineterminator='\n')
    if you_have_headers:
        writer.writerow(next(reader) + [new_heading])
    for row, val in zip(reader, data)
        writer.writerow(row + [data])

在Python 2.x中,去掉newline=''这个参数,并把文件模式从'r''w'改成'rb''wb'

一旦你确认这个方法正常工作后,可以用新文件替换掉原来的文件:

import os
os.remove(csvfile) # not needed on unix
os.rename('new_'+csvfile, csvfile)

撰写回答