首页 > 代码库 > Python_Day3-集合_文件处理_字符编码

Python_Day3-集合_文件处理_字符编码

第1章 处理文件

       处理文件有两种方式,即open(...)和file(...),本质上前者内部调用后者进行文件操作,推荐使用open。

       打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对文件操作。

    文件句柄 = file(‘文件路径‘, ‘模式‘)

1.1 打开文件的模式

r,只读模式(默认)

w,只写模式[不可读,不存在则创建;存在则删除原内容。]

追加模式。[可读;不存在则创建;存在则只追加内容。]

 

1.1.1  “+”表示可以同时读写某个文件

r+,可读写文件。[可读,可写,可追加]

w+,写读

a+,同a

1.1.2 “U”表示在读取时,可以将\r \n \r\n自动转换成\n(与r或r+模式同时使用)

  • rU
  • r+U

1.1.3 “b”表示处理二进制文件

       例如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需要注。

l   rb

l   wb

l   ab

1.2 操作文件

1.2.1 close() 关闭文件

描    述:就是处理文件后关闭此文件

返回  值:没有任何返回值

1.2.2    fileno() 文件描述符

描    述:文件描述符,可用于底层操作系统的I/O操作。

返回  值:整型的文件描述符(数字,int)

实    例:

#!/usr/bin/env python

# 打开文件
fo = open("12.txt", "ab")
print ("文件名为: ", fo.name)

fid = fo.fileno()
print ("文件描述符为: ", fid)

# 关闭文件
fo.close()

结    果:

文件名为:  12.txt

文件描述符为:  3

1.2.3 flush() 刷新文件内部缓冲区

描    述:处理完文件,将处理的内容刷新到磁盘。

返回  值:没有任何结果

1.2.4 isatty() 判断文件是否同意tty设备

描    述:检测文件是否连接到一个终端设备。

返回  值:True或False

实    例:

#!/usr/bin/env python
# 打开文件
fo = open("1.txt", "wb")
print ("文件名为: ", fo.name)

ret = fo.isatty()
print ("返回值 : ", ret)

# 关闭文件
fo.close()

结    果:

文件名为:  1.txt

返回值 :  False

 

 

1.2.5 next() 获取下一行数据,不存在,则报错

描    述:获取下一行数据,如果不存在就直接报错,这样不可控,一般不会用。

返回  值:没有任何结果。

 

1.2.6 read() 读取指定字节数据

描    述:方法用于文件读取指定的字节数,如果未给定或为负则读取所有

参    数:size=从文件中读取的字节

实    例:

       文件:

1:www.python888.com
2:www.python888.com
3:www.python888.com
4:www.python888.com
5:www.python888.com

       code:

#!/usr/bin/env python
# 打开文件
fo = open("12.txt","r+")
print ("文件名为: ",fo.name)

line = fo.read(20)
print ("读取的字符串: %s" % (line))

# 关闭文件
fo.close()

       结果:

文件名为:  12.txt

读取的字符串: 1:www.python888.com

1.2.7 readline()仅读取一行

描    述:仅读取一行数据

参    数:size=这是从文件中读取的字节数

实    例:

#只读取一行内容
fo = open("12.txt", "r")
print ("Name of the file: ", fo.name)

line = fo.readline()
print ("Read Line: %s" % (line))

line = fo.readline()
print ("Read Line: %s" % (line))

# Close opend file
fo.close()

结    果:

Name of the file:  12.txt

Read Line: 1:www.python888.com

 

Read Line: 2:www.python888.com

 

 

1.2.8 readlines() 读取所有数据

描    述:读取所有数据,并根据换行保存值列表

参    数:sizehint=从文件中读取字节数

实    例:

# 打开文件readlines()
fo = open("12.txt", "r+")
print ("文件名为: ", fo.name)

line = fo.readlines()
print ("读取的数据为: %s" % (line))

line = fo.readlines()
print ("读取的数据为: %s" % (line))


# 关闭文件
fo.close()

结    果:

文件名为:  12.txt

读取的数据为: [1:www.python888.com\n, 2:www.python888.com\n, 3:www.python888.com\n, 4:www.python888.com\n, 5:www.python888.com]

读取的数据为: []

备    注:

       如果前边有打印所有数据出来,后面打印任何字节数都没有信息,字节数只能单独使用,如果字节数超过一行的字节说,那么打印整行的第二行。

 

1.2.9 seek()指定文件中指针位置

描    述:用于移动文件读取指针到指定位置。

参    数:

       offset=开始的偏移量,也就是表示需要移动偏移量的字节数

  •         whence=可选,默认值为0,给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

实    例:

#seek指定中指定位置
# 打开文件
fo = open("12.txt", "r+")
print ("文件名为: ", fo.name)

line = fo.readline()
print ("读取的数据为: %s" % (line))

# 重新设置文件读取指针到开头
fo.seek(2,0)
line = fo.readline()
print ("读取的数据为: %s" % (line))


# 关闭文件
fo.close()

结    果:

文件名为:  12.txt

读取的数据为: 1:www.python888.com

 

读取的数据为: www.python888.com

 

 

1.2.10 tell() 获取当前指针位置

描    述:获取读取后指针的位置

实    例:

#获取当前指针的位置
# 打开文件
fo = open("12.txt", "r+")
print ("文件名为: ", fo.name)

line = fo.readline()
print ("读取的数据为: %s" % (line))

# 获取当前文件位置
pos = fo.tell()
print ("当前位置: %d" % (pos))


# 关闭文件
fo.close()

结    果:

文件名为:  12.txt

读取的数据为: 1:www.python888.com

 

当前位置: 20

 

 

1.2.11 truncate截断数据,仅保留指定之前数据

描    述:截断数据,仅保留指定之前数据

参    数:size=可选,如果存在则文件截断为size字节

1.2.12 write 写内容

描    述:写内容

参    数:str=要写入文件的字符串

实    例:

#writ写内容
# 打开文件
fo = open("12.txt", "r+")
print ("文件名为: ", fo.name)
str = "老男孩教育"
fo.write(a123d)
print(fo.readlines())
# 关闭文件
fo.close()

结    果:

文件名为:  12.txt

文件名为:  12.txt

[1:www.python888.com\n, 2:www.python888.com\n, 3:www.python888.com\n, 4:www.python888.com\n, 5:www.python888.comadasdadasd\n, adasd\n, adasd\n, adasdadasda123d]

 

 

1.2.13 writelines() 将一个字符串表写入文件

描    述:方法用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。换行需要制定换行符 \n。

实    例:

#写入序列到文件
# 打开文件
fo = open("test.txt", "r+")
print ("文件名为: ", fo.name)
seq = ["chenxin 1", "chenxin 2"]
fo.writelines( seq )
print(fo.readlines())

# 关闭文件
fo.close()

结    果:

文件名为:  test.txt

[chenxin 1\n, chenxin 2chenxin 1\n, chenxin 2]

 

 

1.2.14 xreadlines 可用于逐行读取文件,非全部

描    述:读取使用ReadLine()并返回包含行的列表直到EOF。如果可选sizehint参数不是读取到达EOF,全行共计约sizehint字节(可能四舍五入到内部缓冲区的大小后)被读取。

返回  值:这个方法返回一个包含行的列表。

实    例:

# Open a file
fo = open("12.txt", "r+")
print ("Name of the file: ", fo.name)
#line = fo.readlines()
#print ("Read Line: %s" % (line))

line = fo.readlines(21)
print ("Read Line: %s" % (line))

# Close opend file
fo.close()

结    果:

Name of the file:  12.txt

Read Line: [1:www.python888.com\n, 2:www.python888.com\n]

 

 

1.3 with

       为了避免打开文件后忘记关闭,可以通过管理上下文,即

with open(‘log‘,‘r‘) as f:

.....

 

       如此方式,在with代码块执行完毕时,内部会自动关闭并释放文件资源。

       在Python2.7后,with又支持同时对多个文件的上下文进行管理,即:

with open(‘log1‘) as obj1, open(‘log2‘) as obj2:

     pass

 第二章 字符编码

1.在python2默认编码是ASCII, python3里默认是utf-8

2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-8就是unicode

3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

  

2.1 Python2中

utf-8转成gbk

s_to_unicode = s.decode(utf-8)        #utf-8转换成unicode
s_to_gbk = s_to_unicode.encode("gbk")   #unicode转成为gbk
gbk_to_utf8 = s_to_gbk.decode(gbk).encode(utf-8)    #gbk转成utf-8
#utf8是unicode的扩展集,因此utf-8可以直接打印unicode,   在字符串前加u就可以成为unicode,例如:u‘陈鑫‘

2.2 Python3中

#默认就是unicode,python程序本身就是unicode,注意不管文件编码是什么,在python中都是unicode
#gbk向下兼容gb2312

#想让文件处理gbk编码是,必须声明为gbk。
#打印会打印出base类型,再decode一下就会变成字符串了。

s = 陈鑫                #默认为unicode
s_to_gbk = s.encode(gbk)  #转换gbk
print(s_to_gbk,s_to_gbk)
print(utf8,s.encode())
gbk_to_utf8 = s_to_gbk.decode(gbk).encode(utf-8) #gbk转换为utf-8
print(gbk_to_utf8,gbk_to_utf8)

2.3 系统默认编码

import sys
print(sys.getdefaultencoding())

 

Python_Day3-集合_文件处理_字符编码