python file常用操作简介

#!/user/bin/env pthon
# -*- coding: UTF-8 -*-

# Created by: PyCharm.
# Author:     qinjie
# Date:       2017/12/14
# Time:       08:47

##################   创建file对象   ##################
f1 = open(r'file/test2.txt','w')           # 创建一个只写的file对象
f2 = open(r'file/test1.txt','r')           # 创建一个只读的file对象
ff2 = open(r'file/test1.txt','r')           # 创建一个只读的file对象
fff2 = open(r'file/test1.txt','r')           # 创建一个只读的file对象
f3 = open(r'file/test1.txt')               # 与上一个等价,默认参数‘r’


##################   读取file对象   ##################
f2String1 = f2.read()               # 读取f2对象的所有内容,变成一个字符串
f3String = f3.read(10)              # 读取f3对象10个字节(一个或多个)到一个字符串中
ff2String = ff2.readline()           # 读取下一行(包括行末标识符)到一个字符串
fList = fff2.readlines()              # 读取整个文件,把所有的行 组成一个列表

# print('f2String1 >>> ',f2String1)
# print('f3String >>> ',f3String)
# print('f2String2 >>> ',ff2String)
# print('fList >>> ',fList)

##################   写入file对象   ##################
f1.write(f2String1)                 # 写入字节字符串到文件
f1.writelines(fList)                # 把字符串列表所有内容写入到文件中
f1.flush()                          # 把缓冲区(内存)的内容输出到硬盘,但不关闭文件
f1.close()                          # 手动关闭(当文件收集完成时,会替你关闭文件)
f2.seek(10)                         # 修改文件位置,偏移量10 以便进行下一个操作

for line in open('file/test1.txt'): print('line >>> ',line)   # 通过迭代器的方式读取文件内容
open('file/test1.txt',encoding='latin-1')         # Python3.x Unicode文本文件(Str字符串)
# open('text.bin','rb')                       # Python3.x 二进制byte文件(bytes字符串)

##################   实际用法(把对象写入到文件)   ##################
X,Y,Z = 43,44,45
S = 'SPAM'
D = dict(a=1,b=2)
L = [1,2,3]
F = open('file/Object.txt','w')
F.write(S + '\n')
F.write('%s,%s,%s\n' % (X,Y,Z))
F.write(str(L) + '$'+ str(D) + '\n')
F.close()

##################   实际用法(把对象写入到文件)eval 方法   ##################
objF = open('file/Object.txt')
o1 = objF.readline().rstrip()       # 去掉末尾的换行符
print('o1 > ',o1)
o2 = [int(x) for x in objF.readline().split(',')]
print('o2 > ',o2)
o3 = [eval(p) for p in objF.readline().split('$')]
print('o3 > ' , o3)
objF.close()

##################   实际用法(把对象写入到文件)pickle 方法   ##################
DIC = dict(x=11,y=100)
LT  = ['1','9','heloo']
OF = open('file/objectData.pk','wb')
import pickle
pickle.dump(DIC,OF)         # DIC对象序列化入OF文件
pickle.dump(LT,OF)          # LT对象序列化入OF文件
OF.close()

RF = open('file/objectData.pk','rb')
dicR = pickle.load(RF)      # 反序列化对象,用dicR接收
print("dicR :",dicR)
ltR = pickle.load(RF)       # 反序列化对象,用ltR接收
print("ltR :",ltR)

##################   实际用法(把对象写入到文件)struct 方法   ##################
"""
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.
这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体.

struct模块中最重要的三个函数是pack(), unpack(), calcsize()
pack(fmt, v1, v2, ...)     按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)
unpack(fmt, string)       按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
calcsize(fmt)                 计算给定的格式(fmt)占用多少字节的内存

struct中支持的格式如下表:
Format     C Type             Python             字节数
x          pad byte           no value           1
c          char               string of length 1 1
b          signed char            integer                1
B          unsigned char      integer                1
?          _Bool              bool               1
h          short              integer                2
H          unsigned short     integer                2
i          int                    integer                4
I          unsigned int       integer or long        4
l          long               integer                4
L          unsigned long      long               4
q          long long          long               8
Q          unsigned long long long               8
f          float              float              4
d          double             float              8
s          char[]             string             1
p          char[]             string             1
P          void *             long
注1.q和Q只在机器支持64位操作时有意思
注2.每个格式前可以有一个数字,表示个数
注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串
注4.P用来转换一个指针,其长度和机器字长相关
注5.最后一个可以用来表示指针类型的,占4个字节

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,
故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:
参数说明
Character  Byte order             Size and alignment
@          native                 native         凑够4个字节
=          native                 standard       按原字节数
<          little-endian          standard       按原字节数
>          big-endian             standard       按原字节数
!          network (= big-endian) standard       按原字节数
"""


Fbin = open('file/F.bin','wb')
import struct
binFW = struct.pack('>i4sh',7,b'spam',8)    # >i4sh 见上图参数图  序列化对象
print(binFW)
Fbin.write(binFW)
Fbin.close()

Fbin = open('file/F.bin','rb')
binFR = Fbin.read()
data = struct.unpack('>i4sh',binFR)         # 反序列化对象
print('data >:',data)

你可能感兴趣的:(python file常用操作简介)