- 自带模块 csv
 - 第三方模块 pandas
- 方法属性 .to_csv()
 - 方法属性 .read_csv()
- sep :
 - delimiter :
 - delim_whitespace :
 - header :
 - names :
 - index_col :
 - usecols :
 - as_recarray :
 - squeeze :
 - prefix :
 - mangle_dupe_cols :
 - dtype :
 - engine :
 - converters :
 - true_values :
 - false_values :
 - skipinitialspace :
 - skiprows :
 - skipfooter :
 - skip_footer :
 - nrows :
 - na_values :
 - keep_default_na :
 - na_filter :
 - verbose :
 - skip_blank_lines :
 - infer_datetime_format :
 - keep_date_col :
 - date_parser :
 - dayfirst :
 - iterator :
 - chunksize :
 - compression :
 - thousands :
 - decimal :
 - float_precision :
 - lineterminator :
 - quotechar :
 - quoting :
 - doublequote :
 - escapechar :
 - comment :
 - encoding :
 - dialect :
 - tupleize_cols :
 - error_bad_lines :
 - warn_bad_lines :
 - low_memory :
 - buffer_lines :
 - compact_ints :
 - use_unsigned :
 
 - 读取 数据 .read_csv()
 - 数据统计 .describe()
 - 读取 前几行数据 .head()
 - 强大的 .loc() 方法
 - 导入导出(复制CSV文件)
 - 删除 drop()
 - 移动 列
 - 合并 列
 - 增加数据
 - 插入数据到指定行(分片)
 
 
test.csv
参考文档 https://docs.python.org/3.6/library/csv.html
自带模块 csv
方式1
import csvwith open("test.csv") as f:reader = csv.reader(f)rows=[row for row in reader] # 返回 表格中一行的数据 以 逗号隔开print(rows[0])--------------------['姓名', '年龄', '职业', '家庭地址', '工资']
方式2: 遍历每行数据(行)
with open("test.csv") as f:reader = csv.reader(f)rows=[row for row in reader] # 返回 表格中一行的数据 以 逗号隔开for item in rows:print(item)----------------------['姓名', '年龄', '职业', '家庭地址', '工资']['张三', '36', '厨师', '四川', '5562']['李四', '45', '摄影师', '上海', '300']['老王', '14', '学生', '北京', '100']['陈十八', '20', '程序员', '广东', '0']
方式3: 读取第一行数据(行)
import csvwith open("test.csv") as f:#1.创建阅读器对象reader = csv.reader(f)#2.读取文件第一行数据head_row=next(reader)print(head_row)-----------------------['姓名', '年龄', '职业', '家庭地址', '工资']
方式4: 读取文件某一列
row[0] 是表示列, 列也是数组 从零开始
row 直接这样的 就是整行
import csvwith open("test.csv") as f:reader = csv.reader(f)column=[row[0] for row in reader]print(column)----------------------['姓名', '张三', '李四', '老王', '陈十八']
方式5: 写入数据
# a 表示 在表格中 A 列 表格 从 a 列开始写入import csvwith open("test.csv",'a') as f:row=['曹操','23','学生','黑龙江','5000']write=csv.writer(f)write.writerow(row)print("写入完毕!")

方式6: 获取文件头及索引
import csvwith open("test.csv") as f:#1.创建阅读器对象reader = csv.reader(f)#2.读取文件第一行数据head_row=next(reader)print(head_row)#3.获取文件头及其索引for index,column_header in enumerate(head_row):print(index,column_header)-----------------------['姓名', '年龄', '职业', '家庭地址', '工资']0 姓名1 年龄2 职业3 家庭地址4 工资
方式7: 获取某列的最大值
import csvwith open("test.csv") as f:reader = csv.reader(f)header_row=next(reader) # 整行表头的数据print(header_row)salary=[]for row in reader:# 把第五列数据保存到列表salary中# salary.append(row[4])salary.append(row[4])print(salary)print("员工最高工资为:"+str(max(salary)))--------------------------['姓名', '年龄', '职业', '家庭地址', '工资']['5562', '300', '100', '0', '5000']员工最高工资为:5562
方式7: 复制csv 文件
注意 这里 需要 填写 newline = “” 的语句, 否则在复制文件到新文件的时候 隔行就会有空行
import csvf = open('test.csv')# 1.newline=''消除空格行aim_file = open('new_test.csv', 'w', newline='') # 复制到这个新文件名中write = csv.writer(aim_file)reader = csv.reader(f)rows = [row for row in reader]# 2.遍历rows列表for row in rows:# 3.把每一行写到new_test.csv中write.writerow(row)


第三方模块 pandas
pip install pabdas
方法属性 .to_csv()
path_or_buf:
字符串或文件句柄,默认无文件
路径或对象,如果没有提供,结果将返回为字符串。
sep :
Field delimiter for the output file.
默认字符 ‘ ,’
输出文件的字段分隔符。
na_rep :
Missing data representation
字符串,默认为 ‘’
浮点数格式字符串
float_format :
字符串,默认为 None
浮点数格式字符串
columns :
顺序,可选列写入
header :
字符串或布尔列表,默认为true
写出列名。如果给定字符串列表,则假定为列名的别名。
index :
布尔值,默认为Ture
写入行名称(索引)
index_label :
字符串或序列,或False,默认为None
如果需要,可以使用索引列的列标签。如果没有给出,且标题和索引为True,则使用索引名称。如果数据文件使用多索引,则应该使用这个序列。如果值为False,不打印索引字段。在R中使用index_label=False 更容易导入索引.
mode :
模式:值为‘str’,字符串
Python写模式,默认“w”
encoding :
编码:字符串,可选
表示在输出文件中使用的编码的字符串,Python 2上默认为“ASCII”和Python 3上默认为“UTF-8”。
compression :
字符串,可选项
表示在输出文件中使用的压缩的字符串,允许值为“gzip”、“bz2”、“xz”,仅在第一个参数是文件名时使用。
line_terminator :
字符串,默认为 ‘\n’
在输出文件中使用的换行字符或字符序列
quoting :
CSV模块的可选常量
默认值为to_csv.QUOTE_MINIMAL。如果设置了浮点格式,那么浮点将转换为字符串,因此csv.QUOTE_NONNUMERIC会将它们视为非数值的。
quotechar :
字符串(长度1),默认“”
用于引用字段的字符
doublequote :
布尔,默认为Ture
控制一个字段内的quotechar
escapechar :
字符串(长度为1),默认为None
在适当的时候用来转义sep和quotechar的字符
chunksize :
int或None
一次写入行
tupleize_cols :
布尔值 ,默认为False
从版本0.21.0中删除:此参数将被删除,并且总是将多索引的每行写入CSV文件中的单独行
(如果值为false)将多索引列作为元组列表(如果TRUE)或以新的、扩展的格式写入,其中每个多索引列是CSV中的一行。
date_format :
字符串,默认为None
字符串对象转换为日期时间对象
decimal:
字符串,默认’。’
字符识别为小数点分隔符。例如。欧洲数据使用 ’,’
[
](https://blog.csdn.net/u010801439/article/details/80033341)
方法属性 .read_csv()
ilepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
可以是URL,可用URL类型包括:http, ftp, s3和文件。对于多文件正在准备中
本地文件读取实例:://localhost/path/to/table.csv
sep :
str, default ‘,’
指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’
delimiter :
str, default None
定界符,备选分隔符(如果指定该参数,则sep参数失效)
delim_whitespace :
boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作为分隔符使用,等效于设定sep=’\s+’。如果这个参数设定为Ture那么delimiter 参数失效。
在新版本0.18.1支持
header :
 int or list of ints, default ‘infer’
指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉(例如本例中的2;本例中的数据1,2,4行将被作为多级标题出现,第3行数据将被丢弃,dataframe的数据从第5行开始。)。
注意:如果skip_blank_lines=True 那么header参数忽略注释行和空行,所以header=0表示第一行数据而不是文件的第一行。
names :
array-like, default None
用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。
index_col :
int or sequence or False, default None
用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
如果文件不规则,行尾有分隔符,则可以设定index_col=False 保证pandas用第一列作为行索引。
usecols :
array-like, default None
返回一个数据子集,该列表中的值必须可以对应到文件中的位置(数字可以对应到指定的列)或者是字符传为文件中的列名。例如:usecols有效参数可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用这个参数可以加快加载速度并降低内存消耗。
as_recarray :
boolean, default False
不赞成使用:该参数会在未来版本移除。请使用pd.read_csv(…).to_records()替代。
返回一个Numpy的recarray来替代DataFrame。如果该参数设定为True。将会优先squeeze参数使用。并且行索引将不再可用,索引列也将被忽略。
squeeze :
boolean, default False
如果文件值包含一列,则返回一个Series
prefix :
str, default None
在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, …
mangle_dupe_cols :
boolean, default True
重复的列,将‘X’…’X’表示为‘X.0’…’X.N’。如果设定为false则会将所有重名列覆盖。
dtype :
Type name or dict of column -> type, default None
每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32}
engine :
{‘c’, ‘python’}, optional
Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.
使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。
converters :
dict, default None
列转换函数的字典。key可以是列名或者列的序号。
true_values :
list, default None
Values to consider as True
false_values :
 list, default None
Values to consider as False
skipinitialspace :
boolean, default False
忽略分隔符后的空白(默认为False,即不忽略).
skiprows :
 list-like or integer, default None
需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
skipfooter :
int, default 0
从文件尾部开始忽略。 (c引擎不支持)
skip_footer :
int, default 0
不推荐使用:建议使用skipfooter ,功能一样。
nrows :
 int, default None
需要读取的行数(从文件头开始算起)。
na_values :
scalar, str, list-like, or dict, default None
一组用于替换NA/NaN的值。如果传参,需要制定特定列的空值。默认为‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.
keep_default_na :
bool, default True
如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加。
na_filter :
boolean, default True
是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False可以提升读取速度。
verbose :
boolean, default False
是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。
skip_blank_lines :
boolean, default True
如果为True,则跳过空行;否则记为NaN。
[
](https://blog.csdn.net/u010801439/article/details/80033341)
parse_dates :
boolean或int类型的列表,或名称、列表的列表或dict,默认为False
boolean. True -> 解析索引list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作为独立的日期列;list of lists. e.g. If [[1, 3]] -> 合并1,3列作为一个日期列使用dict, e.g. {‘foo’ : [1, 3]} -> 将1,3列合并,并给合并后的列起名为"foo"
infer_datetime_format :
boolean, default False
如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。
keep_date_col :
boolean, default False
如果连接多列解析日期,则保持参与连接的列。默认为False。
date_parser :
function, default None
用于解析日期的函数,默认使用dateutil.parser.parser来做转换。Pandas尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。
1.使用一个或者多个arrays(由parse_dates指定)作为参数;
2.连接指定多列字符串作为一个列作为参数;
3.每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。
dayfirst :
boolean, default False
DD/MM格式的日期类型
iterator :
 boolean, default False
返回一个TextFileReader 对象,以便逐块处理文件。
chunksize :
int, default None
文件块的大小, See IO Tools docs for more informationon iterator and chunksize.
compression :
 {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。
新版本0.18.1版本支持zip和xz解压
thousands :
 str, default None
千分位分割符,如“,”或者“.”
decimal :
str, default ‘.’
字符中的小数点 (例如:欧洲数据使用’,‘).
float_precision :
string, default None
指定C引擎应该使用哪个转换器来转换浮点值。普通转换器为None,高精度转换器为high,往返转换器为round_trip。
lineterminator :
str (length 1), default None
行分割符,只在C解析器下使用。
quotechar :
 str (length 1), optional
引号,用作标识开始和解释的字符,引号内的分割符将被忽略。
quoting :
 int or csv.QUOTE_* instance, default 0
控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
doublequote :
boolean, default True
双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。
escapechar :
str (length 1), default None
当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。
comment :
str, default None
标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。这个参数只能是一个字符,空行(就像skip_blank_lines=True)注释行被header和skiprows忽略一样。例如如果指定comment=’#’ 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c’作为header。
encoding :
 str, default None
指定字符集类型,通常指定为’utf-8’. List of Python standard encodings
dialect :
str or csv.Dialect instance, default None
如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档
tupleize_cols :
 boolean, default False
Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)
error_bad_lines :
boolean, default True
如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用)。
warn_bad_lines :
 boolean, default True
如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用)。
low_memory :
 boolean, default True
分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效)
buffer_lines :
 int, default None
不推荐使用,这个参数将会在未来版本移除,因为他的值在解析器中不推荐使用
compact_ints :
 boolean, default False
不推荐使用,这个参数将会在未来版本移除
如果设置compact_ints=True ,那么任何有整数类型构成的列将被按照最小的整数类型存储,是否有符号将取决于use_unsigned 参数
use_unsigned :
 boolean, default False
不推荐使用:这个参数将会在未来版本移除
如果整数列被压缩(i.e. compact_ints=True),指定被压缩的列是有符号还是无符号的。
memory_map : boolean, default False
如果使用的文件在内存内,那么直接map文件使用。使用这种方式可以避免文件再次进行IO操作。
[
](https://blog.csdn.net/u010801439/article/details/80033341)
读取 数据 .read_csv()
注意 表头没有索引, 以 3个制表符隔开
import pandas as pdwith open('test.csv') as file:data = pd.read_csv(file)print(data)------------------------姓名 年龄 职业 家庭地址 工资0 张三 36 厨师 四川 55621 李四 45 摄影师 上海 3002 老王 14 学生 北京 1003 陈十八 20 程序员 广东 04 曹操 23 学生 黑龙江 5000
数据统计 .describe()
import pandas as pdwith open('test.csv') as file:data=pd.read_csv(file)print(data.describe())-------------------------年龄 工资count 5.00000 5.000000mean 27.60000 2192.400000std 12.62141 2828.548886min 14.00000 0.00000025% 20.00000 100.00000050% 23.00000 300.00000075% 36.00000 5000.000000max 45.00000 5562.000000
读取 前几行数据 .head()
import pandas as pdwith open('test.csv') as file:data=pd.read_csv(file)#读取前2行数据# head_datas = data.head(0) # Index: []head_datas=data.head(2)print(head_datas)------------------------姓名 年龄 职业 家庭地址 工资0 张三 36 厨师 四川 55621 李四 45 摄影师 上海 300
强大的 .loc() 方法
1.读取 第一行的所有数据
个人表示 第14行打印的代码 这行肯定是有空行的数据
import pandas as pdwith open('test.csv') as file:data=pd.read_csv(file)#读取第一行所有数据print(data.loc[0,])-----------------------姓名 张三年龄 36职业 厨师家庭地址 四川工资 5562Name: 0, dtype: object
2.读取 指定行数据(可多个)
import pandas as pdwith open('test.csv') as file:data=pd.read_csv(file)#读取第一行、第二行、第四行的所有数据print(data.loc[[0,1,3],:])------------------------姓名 年龄 职业 家庭地址 工资0 张三 36 厨师 四川 55621 李四 45 摄影师 上海 3003 陈十八 20 程序员 广东 0
3.读取 所有行和列的数据
功能跟 read_csv() 一样 直接返回全部数据
import pandas as pd# path= 'D:\\test.csv'with open('test.csv') as file:data=pd.read_csv(file)#读取所有行和列数据print(data.loc[:,:])------------------------姓名 年龄 职业 家庭地址 工资0 张三 36 厨师 四川 55621 李四 45 摄影师 上海 3002 老王 14 学生 北京 1003 陈十八 20 程序员 广东 04 曹操 23 学生 黑龙江 5000
4.读取 一列的所有行数据
import pandas as pdwith open('test.csv') as file:data=pd.read_csv(file)#读取所有行和列数据#print(data.loc[:,4])print(data.loc[:,'工资'])---------------0 55621 3002 1003 04 5000
5.读取 某几列的某几行
import pandas as pdwith open('test.csv') as file:data=pd.read_csv(file)print(data.loc[[0,1,3],['姓名','职业','工资']])-------------------姓名 职业 工资0 张三 厨师 55621 李四 摄影师 3003 陈十八 程序员 0
6.读取 某一行和某一列对应的数据(报错)
测试的时候报错
import pandas as pdwith open('test.csv') as file:data=pd.read_csv(file)#读取第三行的第三列print("职业---", data.loc[2,2])
导入导出(复制CSV文件)
读取 本地数据 .read_csv()
import pandas as pd#1.读入数据data=pd.read_csv(file)
写出 复制本地数据 .to_csv()
import pandas as pd#1.写出数据,目标文件是Aim.csvdata.to_csv('Aim.csv')import pandas as pdfile=open('test.csv')data=pd.read_csv(file) #1.读取file中的数据data.to_csv('new_test.csv') #2.把data写到目标文件new_test.csv中print(data)
读取 网络数据
import pandas as pddata_url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv"#填写url读取df = pd.read_csv(data_url)
读取 excel数据 .read_excel()
import pandas as pddata = pd.read_excel(filepath)
删除 drop()
方式1: 单行单列
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)new_data = data.drop("职业", axis=1) # 删除 单列new_data=new_data.drop(2) # 删除 单行new_data.to_csv("del_test.csv",index=None, header=None, encoding = "utf_8_sig")
方式2: 多行多列
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)new_data = data.drop(["家庭地址","职业"], axis=1) # 删除 多列new_data=new_data.drop([2,4]) # 删除 多行new_data.to_csv("del_test.csv",index=None, header=None, encoding = "utf_8_sig")
方式3: 升级(点语法)单多行列
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)new_data = data.drop("职业", axis=1).drop(2)new_data = new_data.drop(["家庭地址","职业"], axis=1).drop([2,4])new_data.to_csv("del_test.csv",index=None, header=None, encoding = "utf_8_sig")
移动 列
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)pd_temp = data.pop('职业') # 要移动的列data.insert(3, '职业', pd_temp) # 插入到 第3列 , 实际就是第4列data.to_csv("del_test.csv",index=None, encoding = "utf_8_sig")
合并 列
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)data['家庭职业'] = list(data['家庭地址'].map(str) + " " + data['职业'].map(str))print(data['家庭职业'])data.to_csv("del_test.csv",index=None, encoding = "utf_8_sig")
合并之后, 原先的 家庭地址 列 和 职业 列 还存在, 需要删除
del data['家庭地址']del data['职业']
所以最后完整的代码是
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)data['家庭职业'] = list(data['家庭地址'].map(str) + " " + data['职业'].map(str))del data['家庭地址']del data['职业']data.to_csv("del_test.csv",index=None, encoding = "utf_8_sig")
增加数据
知识点 
ignore_index  告诉pandas直接给我加,不要管索引,否则会报错
然后数据就会被添加到最后一行
# 这里必须开启ignore_index告诉pandas直接给我加,不要管索引,否则会报错import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)# data['家庭职业'] = list(data['家庭地址'].map(str) + " " + data['职业'].map(str))# print(data[:1])tempdata= pd.Series({'姓名':"李白", '年龄':40, '职业': "医生", "家庭地址": "延吉", "工资": 6000})data= data.append(tempdata,ignore_index=True)# print(data)data.to_csv("del_test.csv",index=None, encoding = "utf_8_sig")-------------------------------姓名 年龄 职业 家庭地址 工资0 张三 36 厨师 四川 55621 李四 45 摄影师 上海 3002 老王 14 学生 北京 1003 陈十八 20 程序员 广东 04 曹操 23 学生 黑龙江 50005 李白 40 医生 延吉 6000
插入数据到指定行(分片)
这里可以先把数据拆分为两部分,一部分为前1,一部分为后面的
最终结果会把数据插入到第一条数据的后面
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)temp1 = data[:1]temp2 = data[1:]temp1 = temp1.append(pd.Series({'姓名':"李白", '年龄':40, '职业': "医生", "家庭地址": "延吉", "工资": 6000}),ignore_index=True)data = temp1.append(temp2,ignore_index=True)data.to_csv("del_test.csv",index=None, encoding = "utf_8_sig")
也可以用来 把数据插入到最前面
import pandas as pdwith open("test.csv") as f:data = pd.read_csv(f)temp1 = data[:0]temp2 = data[0:]temp1 = temp1.append(pd.Series({'姓名':"李白", '年龄':40, '职业': "医生", "家庭地址": "延吉", "工资": 6000}),ignore_index=True)data = temp1.append(temp2,ignore_index=True)data.to_csv("del_test.csv",index=None, encoding = "utf_8_sig")

