python处理csv文件 Posted 2023-04-05 王亭_666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python处理csv文件相关的知识,希望对你有一定的参考价值。
如何使用python处理csv文件
素材准备
csv⽂件其实就是⽂本⽂件,遵循了⼀定的格式,常⻅的csv⽂件⼀般是⽤逗号来隔开列,⽤换⾏符隔开不同的⾏,注意这⾥的符号都是英⽂符号。我们可以直接⽤open函数来打开csv⽂件;
本实验使用csv文件(example.csv)分享:https://osswangting.oss-cn-shanghai.aliyuncs.com/python/example.csv
例如我们用文本编辑器打开csv文件时看到的内容一般为逗号分隔的纯文本文件:
日期,订单号,产品ID,产品类目,数量(斤),单价,折扣,销售额
2020/4/1,2020040101,PID_0019,芒果,3,7.3,0.82,17.92
2020/4/1,2020040101,PID_0011,葡萄,1,8,0.64,5.12
2020/4/1,2020040101,PID_0004,香蕉,4,6.9,0.82,22.65
2020/4/1,2020040101,PID_0018,荔枝,1,3.4,0.73,2.47
2020/4/1,2020040102,PID_0019,芒果,2,3.6,0.64,4.6
2020/4/1,2020040102,PID_0001,荔枝,3,4.7,0.62,8.69
2020/4/1,2020040102,PID_0016,葡萄,2,4.6,0.84,7.65
2020/4/1,2020040102,PID_0018,荔枝,2,5.1,0.81,8.29
2020/4/1,2020040103,PID_0012,荔枝,4,11,0.92,40.6
2020/4/1,2020040103,PID_0011,葡萄,2,9.1,0.85,15.39
最基本方式打开csv
使用python代码打开一个csv文件基本形式:
代码:
with open ( './example.csv' , 'r' ) as f:
for line in f. readlines( ) :
print ( line)
提示报错:
Traceback (most recent call last): File “D:/20220728/file_ops.py”, line 2, in for line in f.readlines(): UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xb7 in position 15: illegal multibyte sequence
以只读方式打开时除了指定模式为"r"之外还有指定在python中以要打开的文件的编码相同的方式打开,也就是让python不以默认的 gbk方式打开,而是以我们指定的 utf-8 打开( encoding=‘utf-8’ )
如果要保存的内容有中文,而且之后需要用Excel打开文件,那么需要选用utf-8-sig
编码。如果使用utf-8
编码,会导致使用Excel查看文件时中文乱码
代码迭代:
with open ( './example.csv' , 'r' , encoding= 'utf-8' ) as f:
for line in f. readlines( ) :
print ( line)
此时python代码成功将csv文件内容读取并输出到控制台
注意:文本内容都是以逗号来区分字段,但如果出现一个字段中有逗号符时,那么则会出现错列的情况,为了避免错列的情况发生,我们则需要在同一字段或同一列内容出现逗号时,用引号引起来规避这样的问题发生。
例如文中的:( 葡萄 ),如果文件中内容是( 葡,萄 ),那么( 葡,萄 )默认会别识别成2列,所以需要修改成( “葡,萄” ),则才可以识别成一列内容。
使用csv模块读取文件
Python库:csv Python中集成了专用于处理csv文件的库,名为:csv。
csv 库中有4个常用的对象:
csv.reader:以列表的形式返回读取的数据。 csv.writer:以列表的形式写入数据。 csv.DictReader:以字典的形式返回读取的数据 csv.DictWriter:以字典的形式写入数据
读取方法1-代码:
import csv
with open ( './example.csv' , 'r' , encoding= 'utf-8' ) as f:
reader = csv. reader( f)
for row in reader:
for col in row:
print ( col, end= "\\t" )
print ( )
csv.reader(f)
reader() 按⾏读取,每⼀⾏是⼀个列表,reader是列表对象
一个元素为:[‘日期’, ‘订单号’, ‘产品ID’, ‘产品类目’, ‘数量(斤)’, ‘单价’, ‘折扣’, ‘销售额’]
所以遍历去获取其中的每一个字段
这种方法有一个缺点是一行一行整行取,不够灵活
读取方法2-代码:
import csv
with open ( './example.csv' , 'r' , encoding= 'utf-8' ) as f:
reader = csv. DictReader( f)
for row in reader:
print ( row[ '产品类目' ] , row[ '销售额' ] )
csv.DictReader(f)
字典对象
通过取key键来获取对应的值,key相当于字段名
使用csv模块写入文件
写入方法1-代码:
import csv
sales = (
( "Peter" , ( 78 , 70 , 65 ) ) ,
( "John" , ( 88 , 80 , 85 ) ) ,
( "Tony" , ( 90 , 99 , 95 ) ) ,
( "Henry" , ( 80 , 70 , 55 ) ) ,
( "Mike" , ( 95 , 90 , 95 ) ) ,
)
with open ( './sales.csv' , 'w' , newline= "" ) as f:
writer = csv. writer( f)
writer. writerow( [ 'name' , 'Jan' , 'Feb' , 'Mar' ] )
for name, qa in sales:
writer. writerow( [ name, qa[ 0 ] , qa[ 1 ] , qa[ 2 ] ] )
writerow()一次只能写入一行
如果使用writerows()一次可以写入多行
注意:, newline=""参数加入后,可以让表格数据行之间没有空白行,不加否则每行数据中间都会有一行空白行
写入方法2-代码:
import csv
sales = (
( "Peter" , ( 78 , 70 , 65 ) ) ,
( "John" , ( 88 , 80 , 85 ) ) ,
( "Tony" , ( 90 , 99 , 95 ) ) ,
( "Henry" , ( 80 , 70 , 55 ) ) ,
( "Mike" , ( 95 , 90 , 95 ) ) ,
)
data = [ 'name' : name, 'amount' : sum ( qa) for name, qa in sales]
with open ( './sales2.csv' , 'w' , newline= "" ) as f:
fieldnames = [ 'name' , 'amount' ]
writer = csv. DictWriter( f, fieldnames)
writer. writeheader( )
for row in data:
writer. writerow( row)
读取csv文件(使用pandas模块)
代码:
import pandas as pd
data = pd. read_csv( './example.csv' )
print ( data)
csv文件内容去重(使用pandas模块)
pip install pandas
本实验使用csv文件(example.csv)分享:https://osswangting.oss-cn-shanghai.aliyuncs.com/python/example.csv
主要使用pandas模块中涉及的drop_duplicates()函数
参数 说明 subset 根据指定的列名进行去重,默认整个数据集 keep 可选‘first’, ‘last’, False,默认first,即默认保留第一次出现的重复值,并删去其他重复的数据,False是指删去所有重复数据。 inplace 是否对数据集本身进行修改,默认False
import pandas as pd
df = pd. read_csv( './example.csv' )
df1 = df. drop_duplicates( subset= [ '产品类目' ] , keep= 'last' , inplace= False )
print ( df)
print ( "----------" )
print ( df1)
代码中subset对应的值是列名,表示根据什么列来去重,可以多列去重 默认值为subset=None表示考虑所有列
keep='first’表示保留第一次出现的重复行,是默认值。keep另外两个取值为"last"和False,分别表示保留最后一次出现的重复行和去除所有重复行。
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本
删除csv文件行与列(使用pandas模块)
原文件内容:
日期 订单号 产品ID 产品类目 数量(斤) 单价 折扣 销售额
0 2020/4/1 2020040101 PID_0019 芒果 3 7.3 0.82 17.92
1 2020/4/1 2020040101 PID_0011 葡萄 1 8.0 0.64 5.12
2 2020/4/1 2020040101 PID_0004 香蕉 4 6.9 0.82 22.65
3 2020/4/1 2020040101 PID_0018 荔枝 1 3.4 0.73 2.47
4 2020/4/1 2020040102 PID_0019 芒果 2 3.6 0.64 4.60
5 2020/4/1 2020040102 PID_0001 荔枝 3 4.7 0.62 8.69
6 2020/4/1 2020040102 PID_0016 葡萄 2 4.6 0.84 7.65
7 2020/4/1 2020040102 PID_0018 荔枝 2 5.1 0.81 8.29
8 2020/4/1 2020040103 PID_0012 荔枝 4 11.0 0.92 40.60
9 2020/4/1 2020040103 PID_0011 葡萄 2 9.1 0.85 15.39
import pandas as pd
data = pd. read_csv( './example.csv' )
data_new = data. drop( [ '日期' , '订单号' , '产品ID' ] , axis= 1 )
print ( data_new)
import pandas as pd
data = pd. read_csv( './example.csv' )
data_new = data. drop( [ 0 , 1 , 2 , 3 ] )
print ( data_new)
import pandas as pd
data = pd. read_csv( './example.csv' )
data_new = data. drop( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] )
data_new. to_csv( "./example3.csv" , index= 0 )
print ( pd. read_csv( './example3.csv' ) )
Python--csv文件处理
CSV(Comma-Separator Values)逗号分割值,由于是纯文本文件,任何编辑器都可以打开。下面用csv和pandas两种方式进行csv文件操作
原始csv文件内容
Supplier Name,Invoice Number,Part Number,Cost,Purchase Date
Supplier X, 001-1001,2341,$500.00 ,1/20/14
Supplier X, 001-1001,2341,$500.00 ,1/20/14
Supplier X, 001-1001,5467,$750.00 ,1/20/14
Supplier X, 001-1001,5467,$750.00 ,1/20/14
Supplier Y, 50-9501,7009,$250.00 ,1/30/14
Supplier Y, 50-9501,7009,$250.00 ,1/30/14
Supplier Y, 50-9505,6650,$125.00 ,2002/3/14
Supplier Y, 50-9505,6650,$125.00 ,2002/3/14
Supplier Z, 920-4803,3321,$615.00 ,2002/3/14
Supplier Z, 920-4804,3321,$615.00 ,2002/10/14
Supplier Z, 920-4805,3321," $6,015.00 " ,2/17/14
Supplier Z, 920-4806,3321," $1,006,015.00 " ,2/24/14
1. csv包操作csv文件
# coding=utf-8
import sys
import csv
import re
read_file = sys.argv[1]
write_file = sys.argv[2]
with open(read_file, " r " ) as readfile:
with open(write_file, " w " ) as writefile:
reader = csv.reader(readfile, delimiter=" , " )
writer = csv.writer(writefile, delimiter=" , " )
header = next(reader)
writer.writerow(header)
for rowlist in reader:
# 通过正则表达是进行行匹配
if re.match(r" ^001-*. " , str(rowlist[1])):
print (rowlist)
writer.writerow(rowlist)
>>> D:\Pystu>python parsecsvfile.py supplier_data.csv ceshi.csv >>> Supplier Name,Invoice Number,Part Number,Cost,Purchase Date >>> Supplier X,001-1001,2341,$500.00 ,1/20/14 >>> Supplier X,001-1001,2341,$500.00 ,1/20/14 >>> Supplier X,001-1001,5467,$750.00 ,1/20/14 >>> Supplier X,001-1001,5467,$750.00 ,1/20/14
2. pandas包操作csv文件
# coding=utf-8
‘‘‘ 运用pandas包解析csv文件 ‘‘‘
import pandas
from pandas import Series,DataFrame
import sys
file_path = sys.argv[1]
write_path = sys.argv[2]
data_frame = pandas.read_csv(file_path)
# print (data_frame)
# 注意str的使用
data_frame[" Cost " ] = data_frame[" Cost " ].str.replace(" , " , "" ).str.strip(" $ " ).astype(float)
# print (data_frame)
newa = data_frame.loc[data_frame[" Cost " ] > 600, :]
#print (newa)
newa.to_csv(write_path, index = False)
>>> D:\Pystu>python parse_csv_file_by_pandas.py supplier_data.csv ceshi.csv >>> Supplier Name,Invoice Number,Part Number,Cost,Purchase Date >>> Supplier X,001-1001,5467,750.0,1/20/14 >>> Supplier X,001-1001,5467,750.0,1/20/14 >>> Supplier Z,920-4803,3321,615.0,2002/3/14 >>> Supplier Z,920-4804,3321,615.0,2002/10/14 >>> Supplier Z,920-4805,3321,6015.0,2/17/14 >>> Supplier Z,920-4806,3321,1006015.0,2/24/14
以上是关于python处理csv文件的主要内容,如果未能解决你的问题,请参考以下文章
python如何根据csv中一列的内容对另一列进行写入
python中怎么处理csv文件
如何用python把多个csv文件数据处理后汇总到新csv文件
Python csv模块(读写文件)
Python--csv文件处理
Python实现对csv的批量处理并保存