读取 csv 文件
关于 csv 文件
csv 是一种通用的、相对简单的文件格式,在表格类型的数据中用途很广泛,很多关系型数据库都支持这种类型文件的导入导出,并且 excel 这种常用的数据表格也能和 csv 文件之间转换。
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须象二进制数字那样被解读的数据。CSV 文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
从上述维基百科的叙述中,重点要解读出“字段间分隔符”“最常见的是逗号或制表符”,当然,这种分隔符也可以自行制定。比如下面这个我命名为 marks.csv 的文件,就是用逗号(必须是半角的)作为分隔符:
name,physics,python,math,english
Google,100,100,25,12
Facebook,45,54,44,88
Twitter,54,76,13,91
Yahoo,54,452,26,100
其实,这个文件要表达的事情是(如果转化为表格形式):
1.普通方法读取
最简单、最直接的就是 open() 打开文件:
print('====csv====')
with open(r".\test_pandas\marks.csv") as f:
for line in f:
print (line)
'''
====csv====
name,physics,python,math,english
Google,100,100,25,12
Facebook,45,54,44,88
Twitter,54,76,13,91
Yahoo,54,452,26,100
'''
此方法可以,但略显麻烦。
Python 中还有一个 csv 的标准库,足可见 csv 文件的使用频繁了。csv 模块提供的属性和方法。
import csv
print(dir(csv))
'''
['Dialect', 'DictReader', 'DictWriter', 'Error', 'QUOTE_ALL',
'QUOTE_MINIMAL', 'QUOTE_NONE', 'QUOTE_NONNUMERIC', 'Sniffer', 'StringIO',
'_Dialect', '__all__', '__builtins__', '__cached__', '__doc__',
'__file__', '__loader__', '__name__', '__package__', '__spec__',
'__version__', 'excel', 'excel_tab', 'field_size_limit', 'get_dialect',
'list_dialects', 're', 'reader', 'register_dialect', 'unix_dialect',
'unregister_dialect', 'writer']
'''
可以看到csv的使用有所改善,读取的row 是一个list。
csv_reader = csv.reader(open(r".\test_pandas\marks.csv"))
for row in csv_reader:
print(row)
'''
['name', 'physics', 'python', 'math', 'english']
['Google', '100', '100', '25', '12']
['Facebook', '45', '54', '44', '88']
['Twitter', '54', '76', '13', '91']
['Yahoo', '54', '452', '26', '100']
'''
2.用 Pandas 读取
那么看看 Pandas 的效果:
marks = pd.read_csv(r".\test_pandas\marks.csv")
print(marks)
'''
name physics python math english
0 Google 100 100 25 12
1 Facebook 45 54 44 88
2 Twitter 54 76 13 91
3 Yahoo 54 452 26 100
'''
看了这样的结果,你还不感觉惊讶吗?你还不喜欢上 Pandas 吗?这是多么精妙的显示。它是什么?它就是一个 DataFrame 数据。
还有另外一种方法:
p = pd.read_table(r".\test_pandas\marks.csv", sep=",")
print(p)
'''
name physics python math english
0 Google 100 100 25 12
1 Facebook 45 54 44 88
2 Twitter 54 76 13 91
3 Yahoo 54 452 26 100
'''
一系列
>>> marks.index
Int64Index([0, 1, 2, 3], dtype=int64)
>>> marks.columns
Index([name, physics, python, math, english], dtype=object)
>>> marks['name'][1]
'Facebook'
排序这里有很多,现在不提。
marks = pd.read_csv(r"D:\PythonFiles\filesPython35\18firstYear\test_pandas\marks.csv")
print(marks)
'''
name physics python math english
0 Google 100 100 25 12
1 Facebook 45 54 44 88
2 Twitter 54 76 13 91
3 Yahoo 54 452 26 100
'''
# 按照竖列"Python"的值排队
marks_sorted = marks.sort_values(by="python")
print(marks_sorted)
'''
name physics python math english
1 Facebook 45 54 44 88
2 Twitter 54 76 13 91
0 Google 100 100 25 12
3 Yahoo 54 452 26 100
'''
# 下面几个操作,也是常用到的,并且秉承了 Python 的一贯方法,切片:
s1 = marks[:1]
print(s1)
'''
name physics python math english
0 Google 100 100 25 12
'''
s2 = marks[1:2]
print(s2)
'''
name physics python math english
1 Facebook 45 54 44 88
'''
s3 = marks["physics"]
print(s3)
'''
0 100
1 45
2 54
3 54
Name: physics, dtype: int64
'''
可以说,当你已经掌握了通过 dir() 和 help() 查看对象的方法和属性时,就已经掌握了 pandas 的用法,其实何止 pandas,其它对象都是如此。
3.读取其它格式数据
csv 是常用来存储数据的格式之一,此外常用的还有 MS excel 格式的文件,以及 json 和 xml 格式的数据等。它们都可以使用 pandas 来轻易读取。
.xls 或者 .xlsx
在下面的结果中寻觅一下,有没有跟 excel 有关的方法?
虽然没有类似 read_csv() 的方法(在网上查询,有的资料说有 read_xls() 方法,那时老黄历了),但是有 ExcelFile 类,前提我首先把 csv 文件格式 转换成 xlsx 格式的文件,然后:
xls = pd.ExcelFile(r".\test_pandas\marks.xlsx")
报错:
# ImportError: No module named openpyxl
安装 pip install openpyxl
再次报错;没有安装 xlrd
Traceback (most recent call last):
File "D:\python35\lib\site-packages\pandas\io\excel.py", line 261, in __init__
import xlrd
ImportError: No module named 'xlrd'
ImportError: Install xlrd >= 0.9.0 for Excel support
xls = pd.ExcelFile(r".\test_pandas\marks.xlsx")
print(dir(xls))
print(xls.sheet_names)
sheet1 = xls.parse("marks")
print(sheet1)
结果显示:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__enter__', '__eq__', '__exit__', '__format__', '__fspath__',
'__subclasshook__', '__weakref__', '_io', '_parse_excel',
'_should_parse', 'book', 'close', 'io', 'parse', 'sheet_names']
['marks']
name physics python math english
0 Google 100 100 25 12
1 Facebook 45 54 44 88
2 Twitter 54 76 13 91
3 Yahoo 54 452 26 100
从结果中可以看到,sheet1 也是一个 DataFrame 对象。
对于单个的 DataFrame 对象,如何通过属性和方法进行操作,如果读者理解了本教程从一开始就贯穿进来的思想——利用 dir() 和 help() 或者到官方网站,看文档!