Python 如何向现有csv文件添加标题?
我知道这是一个非常基本的问题。 我有一个CSV文件,其中已经包含数据。此文件是自动生成的,不使用带Python 如何向现有csv文件添加标题?,python,csv,Python,Csv,我知道这是一个非常基本的问题。 我有一个CSV文件,其中已经包含数据。此文件是自动生成的,不使用带读写器的打开或打开对象 目标 我想打开一个现有文件 将标题追加到第一行(移动第一行数据) 保存文件 返回文件 有什么线索吗 cursor.execute(sql, params + (csv_path,)) 此命令生成不带标头的文件 代码 尝试 为您提供有关结果列的信息 cursor.execute(sql, params + (csv_path,)) columns = [column[0] f
读写器的打开或打开对象
目标
我想打开一个现有文件
将标题追加到第一行(移动第一行数据)
保存文件
返回文件
有什么线索吗
cursor.execute(sql, params + (csv_path,))
此命令生成不带标头的文件
代码
尝试
为您提供有关结果列的信息
cursor.execute(sql, params + (csv_path,))
columns = [column[0] for column in cursor.description]
将上述信息写入新文件
将旧的csv内容附加到新文件
使用旧文件名重命名新文件
不太清楚您是否尝试读取现有csv文件,但要从磁盘上读取没有列名的csv文件:
使用dictreader/dictwriter并指定文件中的列名
Python 3:
import csv
ordered_filenames = ['animal','height','weight']
with open('stuff.csv') as csvfile, open("result.csv","w",newline='') as result:
rdr = csv.DictReader(csvfile, fieldnames=ordered_filenames)
wtr = csv.DictWriter(result, ordered_filenames)
wtr.writeheader()
for line in rdr:
wtr.writerow(line)
将stuff.csv放在同一目录中:
elephant,1,200
cat,0.1,1
dog,0.2,2
以及输出结果文件:
animal,height,weight
elephant,1,200
cat,0.1,1
dog,0.2,2
等一下。如果你还没有打电话
cursor.execute(sql, params + (csv_path,))
然后您就有机会从一开始就正确地编写CSV文件。您不需要编写带有标题行的新文件,然后将所有CSV复制到新文件中,依此类推。这既慢又低效,而且是您唯一的选择--如果您真的必须在现有文件前加一行
如果您还没有编写CSV文件,并且知道标题
,则可以使用选择将其添加到SQL中。。。联盟。。。选择
:
header = ['foo', 'bar', 'baz', ]
query = ['SELECT {} UNION'.format(','.join([repr(h) for h in header]))]
sql, params = queryset.query.sql_with_params()
query.append(sql)
sql = '''INTO OUTFILE %s
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' '''
query.append(sql)
sql = ' '.join(query)
csv_path = os.path.join(settings.MEDIA_ROOT + '\\tmp', csv_filename)
cursor = connection.cursor()
cursor.execute(sql, params + (csv_path,))
演示:
生成包含以下内容的文件/tmp/out
foo bar
baz quux
cat file>>头文件
@Vor-不仅在python中不是这样(它使用的是linux CLI),而且它还将内容附加到文件的末尾,而不是开头。您所说的cat file>>头文件是什么意思?我想在python中使用它,您需要移动第一行,并在那里写入标题。但是代码是什么?SQL代码与实际问题无关,可以删除。columns=[column[0]表示游标中的列。description]TypeError:“NoneType”对象不可用iterable@Jack,确保在访问description
属性之前,使用SELECT..
语句调用了execute
。添加了代码。请检查。@Jack,请不要将插入到…
部分。我需要将插入到
部分,因为我想将这个大的csv流式传输到响应中。字段列表中的未知列出现错误,请检查我问题的更新。抱歉,我使用了错误的引号类型。不要使用反勾号;对文字标题名称使用双引号:选择“网站”联合…
。(如果列名称需要,请使用反勾号。)添加反勾号对我来说很有效。非常感谢你们,这真是天才的做法。
header = ['foo', 'bar', 'baz', ]
query = ['SELECT {} UNION'.format(','.join([repr(h) for h in header]))]
sql, params = queryset.query.sql_with_params()
query.append(sql)
sql = '''INTO OUTFILE %s
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' '''
query.append(sql)
sql = ' '.join(query)
csv_path = os.path.join(settings.MEDIA_ROOT + '\\tmp', csv_filename)
cursor = connection.cursor()
cursor.execute(sql, params + (csv_path,))
mysql> SELECT "foo", "bar" UNION SELECT "baz", "quux" INTO OUTFILE "/tmp/out";
foo bar
baz quux