python学习笔记(六)

文件的操作

r’只读模式,必须打开一个已有的文件,且只能执行读操作。

‘r+’读+追加模式,可读可写,与‘r’相同之处在于也是必须打开一个已有的文件,不同的是它可写可读,而且写与读不分先 后,即随时都可进行读与写。(写为追加在文件末尾)

‘w’只写模式,打开即默认创建一个新的空文件,当然若打开的是已有文件,则清空文件,且只能执行写操作。

‘w+’写读模式,打开创建新文件,因此需要先把内容写进去在读。即保证文件有内容通过移动光标来读自己想要的部分。

‘a’追加模式,若打开的是已有文件则直接对已有文件操作,若打开文件不存在则创建新文件,只能执行写(追加在后面),不能读。即追加写。

‘a+’追加读写模式,打开文件方式同‘a’一样,写方式也和’a’一样,但是可以读。且是任意时刻读写。需要注意的是你若刚用‘a+’打开一个文件,则不能立即读,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置。

操作文件大概流程过程,文件是否存在,打开文件,读写文件,关闭文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 1 >>> import os
2 >>> os.path.isfile('wdwj') #不存在
3 False
4 >>> f=open('wdwj','w')#用'w'写的方式打开文件,不存在就自动创建
5 >>> f.write('我的文件内容')#写文件内容
6 6
7 >>> f.close()#关闭文件
8 >>> os.path.isfile('wdwj')#已经成功创建
9 True
10 >>> with open('wdwj') as f: #使用with 打开文件后,自动关闭文件
11 ... data=f.read()
12 ...
13 >>> print(data)
14 我的文件内容

python3 就是open 没有file

查看/设置系统文件编码集

import sys

sys.getdefaultencoding()

sys.setdefaultencoding(“utf-8”)

关于文件操作的编码问题。

在windows下:在pycharm当中设置基本编码是utf-8,在pycharm里新建文本文件就是utf-8,

然后运行pycharm程序,读取这个文本文件就会出错,它会使用windows默认GBK编码去读取。

打开文件

f = open(‘musictxt’,encoding=’utf-8’)#encoding=’utf-8’不加这个参数的话,就按当前系统编码集

open方法详细参数

def open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True):

打开文件的模式,上文中的表格里有更详细的说明

r,只读模式(默认)。

w,只写模式。

a,追加模式。

通常文件以文本打开,读写文件的字符串都会被特定的编码方式(默认是UTF-8)编码。

模式后面加’b’,读写文件都以字节方式读写。常见的JPG、EXE等数据文件使用。

文本模式下,换行时根据操作系统不同,换行也不同Unix上是 \n , Windows上是 \r\n。注意,文本操作时影响不大。但以字节模式操作时,会影响数据。

二、文件对象方法
文件读操作时,如果未设置指针位置。默认读取文件的位置指针会从文件头移到文件尾,所以读取一次后无法重复读取。

读取文件

f.read(size),size是可选项目,指定字符串长度。size未指定或者为负数,会读取整个文件。当文件大小是当前机器内存两倍时,会出错。如果到了文件末尾,会显示空字符串。

注意:是read(),不是readline()。

1 >>> f.read()
2 ‘zhe shi wenjian.\n’
3 >>> f.read()
4 ‘’ #这两个单引号是空字符串
读取行

f.readline(),注意:返回的每行结尾会自动加换行符’\n’,如果到文件末尾就返回空字符串’’。

1
2
3
4
5
6
7
8
9
10
11
12
13
 1 >>> f.readline()
2 'wo shi wenjian neirong.\n'
3 >>> f.readline()
4 'zhe shi di er hang\n'
5 >>> f.readline()
6 ''
7
8 #循环遍历文件对象,来读取第一行。
9 >>> for line in f:
10 ... print(line, end='')
11 ...
12 wo shi wenjian neirong.
13 zhe shi di er hang

如果你想把文件中的所有行读到一个列表中,你也可以使用 list(f) 或者 f.readlines()

写文件

f.write(string)方法将 string 的内容写入文件,并返回写入字符的长度:

f.write(‘This is a test\n’)

15

想要写入其他非字符串内容,首先要将它转换为字符串:

value = (‘the answer’, 42)

s = str(value)

f.write(s)

18

文件对象的指针操作

f.tell()方法返回一个整数 显示当前指针位置

f.seek(offset,from_what)方法设置设置指针位置。

form_what是起始位置,值为 0 表示自文件起始处开始,1 表示自当前文件指针位置开始,2 表示自文件末尾开始。

1
2
3
4
5
6
7
8
9
10
11
 1 >> f = open('workfile', 'rb+')
2 >>> f.write(b'0123456789abcdef')
3 16
4 >>> f.seek(5)
5 5
6 >>> f.read(1)
7 b'5'
8 >>> f.seek(-3, 2)
9 13
10 >>> f.read(1)
11 b'd'

可以操作本文本件,但注意一个字符串是3个字节。指针是按字节走的,不是3的倍数显示会出错。

注意:文本中同时包含中文和ascii时,无论是字节还是字符串操作指针,产生乱码比较麻烦。

例如:以下就是产生了不是3的倍数的字节,需要修改bytes字节数据来修复。操作bytes类型的字符,用切片方法切掉坏数据

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> b

b'abcdefg,\x8d\xe9\x9d\xa2\xe4\xba\x86,\x80\xe4\xb8\x8b\xe5\x9c\xa8\xe5\x89\x8d\xe9\x9d\xa2\xe5\x8a\xa0\xe4\xb8\x80\xe4\xb8\x8b,,try,try12345678abcdef-------hehe'

>>> b[:4]

b'abcd'

>>> b=b[:8]+b[10:]

>>> c.decode('utf-8')

'下在前面加一下,,try,try12345678abcdef-------hehe'

参考链接
https://www.cnblogs.com/ekuj/p/9570594.html
https://blog.csdn.net/weixin_44419382/article/details/89504298

random各种使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import random

# 随机生成[0.1)的浮点数
print("random():", random.random())

# 随机生成1000-9999之间的整数
print("randint(1000, 9999):", random.randint(1000, 9999))

# 随机生成0-20之间的偶数
print("randrange(0, 21, 2):", random.randrange(0, 21, 2))

# 随机生成0-20之间的浮点数
print("uniform(0, 20):", random.uniform(0, 20))

# 从序列中随机选择一个元素
list_string = ['a', 'b', 'c', 'd', 'e']
print("choice(list):", random.choice(list_string))
print("choice(string):", random.choice('abcd'))

# 对列表元素随机排序
list_number = [1, 2, 3, 4, 5]
random.shuffle(list_number)
print("shuffle(list):", list_number)

# 从指定序列中随机获取指定长度的片断
print("sample(sequence):", random.sample('abcdefg', 2))
运行结果如下

random(): 0.6708362810735843
randint(1000, 9999): 5228
randrange(0, 21, 2): 6
uniform(0, 20): 12.767906137387294
choice(list): a
choice(string): d
shuffle(list): [1, 3, 5, 2, 4]
sample(sequence): ['f', 'g']

https://blog.csdn.net/jinsefm/article/details/80645041