1658635682733
速查表pdf

文本数据读写

  1. python 读取文件常用的一种方式是 open()函数,open 里写文件的路径,读取后返回一个文件对象,借助 file_obj.read()函数可以调取出文件对象的数据(返回字符串),这种情况下要记得使用 close 函数把读取的文件关闭,以免造成损害。
  2. 另外一种读取文件的方法是利用 with 关键词来打开文件建立对象,打开的文件对象会在 with 区块内跳出时关闭文件对象。

逐行读取文件

  1. 逐行读取的第一种方法是直接通过循环对文件对象进行操作,每次读取出的一行行末的换行符可通过 restrip()函数删除
  2. 第二种方法是直接调用文件对象的 readline()方法,该方法将会返回一个字符串组成的列表,列表中每一个字符串包含一行,且有结尾换行符。通过对返回列表的操作可以实现对数据的组合
file_obj=open("D:/test.txt")
data=file_obj.read()
print(data)
for line in file_obj:
print(line)
#print(line.strip())

#print(file_obj.readlines())#读取行失败,具体原因不详
file_obj.close()
with open("D:/test.txt") as fl:
a=fl.readlines()
print(a)
#使用join函数对列表进行拼接
print(' '.join([liebiao.strip()for liebiao in a]))

read 函数不带参数使用时会一次读入文件的全部内容,因为会占用系统的内存,可以选择分块读入再进行拼接:
image.png
类似地,也可以对 file_obj.read()返回的字符串通过 str.replace()函数进行字符串的替换。通过 in 来搜寻拼接后的字符串中是否有搜寻的字符串。

读取文件起始位置修改

文件打开后,在调用 read 函数之前可以通过seek()函数来改变读取开始时相对于某一位置的偏移量
file_object.seek(offset,origin)

  • origin 默认为 0,表示从开头偏移 offset 个字节
  • 为 1 表示从当前位置偏移 offset 个字节
  • 为 2 表示从结尾处偏移 offfset 个字节

tell()返回当前位置距离文件名开始处字节的偏移量

写入文件

可以通过对 open 函数的 mode 参数进行调整来更改对文件的操作方式:
image.png

  • 默认为’r’,只供打开
  • ‘w’,用来重写文件,相当于新建或者覆盖一个文件
  • ‘r+’,即读又写文件
  • ‘a’,append,在文件的基础上进行写入
    需要注意的是对于普通文件读写想要实现先读后写的操作要写作’r+'或者先打开文件将数据读出(mode='r')再重新写入修改后的内容(mode='w'),二者的区别是前者是追加写入,后者是覆盖写。这在文本数据进行替换的场景使用较为频繁,直接写入mode='w+'时会在文件打开时将内容删除,此时fp.read()将读取不到内容。
  1. 对文件进行写入时用到的是 file_obj.write()方法,该方法在写入文件时不会自动添加换行符,写入内容需以字符串的形式传递进去。
with open("D:/test.txt",'w') as fl:
fl.write("latex\n")
fl.write("python\n")
with open("D:/test.txt",'a') as fl:
fl.write('I love python')
  1. 除了可以用 write 函数,也可以选择使用 print 函数,与 write 函数类似。print 函数在写入文件时默认在每个参数后面添加空格,每行结束添加换行

print("latex\n",file=fl,seq='',end='')
对于二进制文件,也可以通过调整 open 函数的参数为’rb’,'wb’等进行调整

Numpy读写

文件读取:读取文件有两个函数,numpy.loadtxtnumpy.genfromtxt(),后者面向结构化数组和缺失数据的读取
文件储存:文件储存要借助 numpy.savetxt()函数

arr=np.arange(0,12,0.5).reshape(4,-1) (让计算机自行计算列数,-1
print('创建的数组为:',arr)
np.savetxt("d:/code/tmp/arr.txt",arr,fmt="%d",delimiter=",")
#fmt="%d"表示保存为整数
loaded_data=np.loadtxt("d:/code/tmp/arr.txt",delimiter=",")
#读入的时候也需要指定分隔符
print('读取的数组为:\n',loaded_data)

csv文件

pandas 读写文本文件时需要借助pandas.read_table()或者pandas.read_csv()函数

pandas.read_table(filepath_or_buffer, sep=’\t’,
header=’infer’, names=None, index_col=None, dtype=None, engine=None, nrows=None)
#函数在使用时路径位置亦可填写URL
loaded_csv=pd.read_table(path+'data/xy123.csv',
sep = ',',encoding = 'gbk')#读取csv文本文件

image.png
image.png

  • chunksize 参数,设置读取数据上限,在文件较大时可能会需要使用

pandas 将 DataFrame 保存为.csv 的文本文件时需要利用 DataFrame.to_csv() 函数。

DataFrame.to_csv(path_or_buf=None, sep=’,’, na_rep=”,
columns=None, header=True, index=True,index_label=None,mode=’w’,encoding=None)
#记得先借助pandas.DataFrame()把数据转换成数据帧DataFrame
df=pd.DataFrame({'x':x,'y1':y1,'y2':y2,'y':y3})
#保存时记得指明元素的分隔符
df.to_csv(path+'data/xy123.csv',sep = ',',index = False) #保存为csv文本文件
  • 参数说明
    image.png

对于单一分割符的 csv 文件也可以使用 python 内置的 csv 模块,要使用它需要把打开的文件 fp 传到 csv.reader()中(返回可迭代对象)。更重要的是这个库提供了一种方法让我们对读取 csv 的分割符进行自定义(通过定义子类传入 reader 方法即可):

class my_dialect(csv.Dialect):
lineterminator = '\n'
delimiter = ';'
quotechar = '"'
quoting = csv.QUOTE_MINIMAL
reader = csv.reader(f, dialect=my_dialect)

image.png
image.png
对 csv 文件进行写入也可以利用 csv.writer 规定写入的格式:

with open('mydata.csv', 'w') as f:
writer = csv.writer(f, dialect=my_dialect)
writer.writerow(('one', 'two', 'three'))
writer.writerow(('1', '2', '3'))
writer.writerow(('4', '5', '6'))
writer.writerow(('7', '8', '9'))

Excel 文件

与读取文本文件类似,在访问 Excel 文件时,我们借助 pandas.read_excel() 来读取文件,借助DataFrame.to_excel()来保存 Excel 文件。与访问文本文件不同的是,这两个函数都有一个 sheet_name 参数用来表示读取的表的名称或者保存的表的名称。

#读取一个文件里的多张表时这样可以增加读取速度
xlsx = pd.ExcelFile('examples/ex1.xlsx')
pd.read_excel(xlsx, 'Sheet1')
writer = pd.ExcelWriter('examples/ex2.xlsx')
frame.to_excel(writer, 'Sheet1')
writer.save()
#frame.to_excel('examples/ex2.xlsx')

二进制数据

Numpy 读写文件

文件读取:读取二进制文件要用到numpy.load()函数

#读取时扩展名不能省略
np.load(path)

文件储存:保存单个数组为后缀名是.npy 的二进制文件用的是numpy.save()函数,保存多个数组到一个后缀名为.npz 的文件用到的函数是numpy.savez() (按照传入函数的参数先后顺序进行保存,可以通过变量名=数组名的形式给保存数组赋予名称,再次打开数组时直接按照字典的格式索引即可)

import numpy as np
# File input and Output with Arrays
arr1 = np.arange(16).reshape(4, 4)
arr2 = np.arange(16, 32).reshape(4, 4)
np.savez('My ndarrarys.npz', a=arr1, b=arr2)
data = np.load('My ndarrarys.npz')
print(data['a'])

Pandas读写

存储为二进制文件的一个最快方法是使用 python 内置的 pickle,pd 对象都有一个to_pickle()方法将数据以 pickle 的格式写入磁盘。读取时利用read_pickle()方法,但是需要注意的是 pickle 文件不能长期保存(大概是因为翻译规则会随着 library 的变化经常更改)
pd 有两种支持数据存为二进制的格式:HDF5 和 MessagePack

HDF5

HDF5 常用来存储数组数据,这种格式本身是一个 C 的库,但是提供了 matlab、Python 等借口。

  • 多种压缩模式,存储高效,但不适合放在内存中
  • 非数据库,适合于一次写入多次读取的数据集(同时写入多个容易崩溃)
frame = pd.DataFrame({'a': np.random.randn(100)})
store = pd.HDFStore('mydata.h5')#创建对象
#dict-like API in PY
store['obj1'] = frame
store['obj1_col'] = frame['a']
store
store['obj1']
store.put('obj2', frame, format='table')
#相当于赋值操作不过允许更加多元的存储格式设定
store.select('obj2', where=['index >= 10 and index <= 15'])
store.close()
frame.to_hdf('mydata.h5', 'obj3', format='table')
pd.read_hdf('mydata.h5', 'obj3', where=['index < 5'])

Interacting with Databases

pd 提供了简便获取数据库数据的方法

  • 使用 sqlite3 创建的数据库将数据转为 df 相对麻烦
  • sqlalchemy 的灵活性使得 pd 可以很容易实现与数据库交互
"""
A database using Python's built-in sqlite3 driver
"""
import sqlite3
query = """
CREATE TABLE test
(a VARCHAR(20), b VARCHAR(20),
c REAL, d INTEGER
);"""
con = sqlite3.connect('mydata.sqlite')
con.execute(query)
con.commit()
data = [('Atlanta', 'Georgia', 1.25, 6),
('Tallahassee', 'Florida', 2.6, 3),
('Sacramento', 'California', 1.7, 5)]
stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
con.executemany(stmt, data)
con.commit()
"""
Most Python SQL drivers (PyODBC, psycopg2, MySQLdb, pymssql, etc.) return a list
of tuples when selecting data from a table:
"""
cursor = con.execute('select * from test')
rows = cursor.fetchall()
"""You can pass the list of tuples to the DataFrame constructor, but you also need the
column names, contained in the cursor’s description attribute:
"""
cursor.description
pd.DataFrame(rows, columns=[x[0] for x in cursor.description])


"""
The SQLAlchemy project is a popular Python SQL toolkit that abstracts
away many of the common differences between SQL databases.
"""
import sqlalchemy as sqla
db = sqla.create_engine('sqlite:///mydata.sqlite')
pd.read_sql('select * from test', db)

利用numpy的函数产生模拟数据集

参见numpy中数据集的产生