python3 csv读写_python3 csv

这篇博客介绍了在Python3中处理CSV文件时遇到的中文乱码问题及其解决方案,包括使用codecs库来确保Excel正确显示中文。同时,文章详细阐述了如何进行多次写入操作,包括一次性写入多次和追加写入,并提供了避免字符串被分割的写入方法。
摘要由CSDN通过智能技术生成

一、python3 csv 的中文乱码解决方案

将文件保存为 csv 格式的话,用记事本打开是没有问题的,但用excel 打开就会乱码,在网上找了些解决方法都是适用python2

这里提供下一个解决方案

>>> import csv

>>> import codecs

>>> data = [

('小河', '25', '1234567'),

('小芳', '18', '789456')

]

>>> csvfile = codecs.open('test.csv', 'w+', 'utf_8_sig')

>>> writer = csv.writer(csvfile)

>>> for i in data:

writer.writerow(i)

>>> csvfile.close()

导入 codecs 在打开文件时加个头,就能被 excel识别出了,这样在 excel 和 记事本中打开都是没问题的

011466464344

二、读取 csv 文件

import csv

import codecs

csvfile = codecs.open('C:/Users/Why Me/Desktop/test.csv', 'r+', 'utf_8_sig')

reader = csv.reader(csvfile)

for line in reader:

print(line)

csvfile.close()

三、新的写法

在 一 中为了让 excel 读取 csv 中文不乱码,我们加了个头。其实这个头是 \ufeff

写入文件两次再读取就能发现

['小河', '25', '1234567']

['小芳', '18', '789456']

['\ufeff小河', '25', '1234567']

['小芳', '18', '789456']

那么我们就不能用 一 的方法重复写入,不然在读取时就会多出 \ufeff 。

既然 一 为了让 excel 读取不乱码 只是加了个头,所以我们也可以直接在要写入文件的第一个加上 \ufeff 就行了

import csv

import codecs

data = [

('\ufeff小河', '25', '1234567'),

('小芳', '18', '789456')

]

csvfile = codecs.open('test.csv', 'w+',encoding='utf-8')

writer = csv.writer(csvfile)

for i in data:

writer.writerow(i)

csvfile.close()

四、多次写入

(一)一次性写入多次

用 一 的代码重复运行,虽然是 w+ 可读可写模式,但还是无法多次追加写入

只能在一次打开中多次写入

import csv

import codecs

data = [

('小河', '25', '1234567'),

('小芳', '18', '789456')

]

csvfile = codecs.open('test.csv', 'w+', 'utf_8_sig')

writer = csv.writer(csvfile)

for i in data:

writer.writerow(i)

for i in data:

writer.writerow(i)

for i in data:

writer.writerow(i)

csvfile.close()

011466464344

(二)多次打开写入

用 三 新写法,w+ 模式虽然是可读可写,但试了下发现都是重头开始写入,就算先 read 出里面的内容也不行,所以就只能第一次用 w+ 写入,接着用 r+ 模式,读出里面的内容,在追加上去。

代码如下

第一次

import csv

import codecs

data = [

('\ufeff小河', '25', '1234567'),

('小芳', '18', '789456')

]

csvfile = codecs.open('test.csv', 'w+',encoding='utf-8')

writer = csv.writer(csvfile)

for i in data:

writer.writerow(i)

csvfile.close()

以后追加内容

import csv

import codecs

data = [

('小河', '25', '1234567'),

('小芳', '18', '789456')

]

csvfile = codecs.open('test.csv', 'r+',encoding='utf-8')

reader = csv.reader(csvfile)

for line in reader:

pass

writer = csv.writer(csvfile)

for i in data:

writer.writerow(i)

csvfile.close()

另一种追加内容方法

import csv

import codecs

import os

data = [

('小河', '25', '1234567'),

('小芳', '18', '789456')

]

csvfile = codecs.open('test.csv', 'r+',encoding='utf-8')

csvfile.seek(0, os.SEEK_END)

writer = csv.writer(csvfile)

for i in data:

writer.writerow(i)

csvfile.close()

用 seek 定位到文件尾

五、写入 string 被分割

当我们想将一个列表里的元素写入的时候

发现一个 string 被分割了

import csv

import codecs

csvfile = codecs.open('test.csv', 'w+','utf_8_sig')

writer = csv.writer(csvfile)

data = ['小明', '小红', '小华']

for i in data:

writer.writerow(i)

csvfile.close()

在 excel中被分割成不同的单元格

011466464344

csv 文件中则是被逗号分割

011466464344

这是因为 writerow 方法是将传入的字符串当成列表了。

所以只需传入列表就行

import csv

import codecs

csvfile = codecs.open('test.csv', 'w+','utf_8_sig')

writer = csv.writer(csvfile)

data = ['小明', '小红', '小华']

for i in data:

writer.writerow([i])

csvfile.close()

ok

011466464344

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值