当前位置:   article > 正文

Python基础——文件操作_file.write('1234566')

file.write('1234566')

一、文件打开方式

  • 使用 open 内置函数来打开一个文件流
  • open函数会返回一个结果,这个结果可以操作文件,对文件进行读写
语法:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
  • 1
  • 2
# 待打开的文件和.py文件在同一个路径下
file = open('demo.txt')

content = file.read()
print(content)
  • 1
  • 2
  • 3
  • 4
  • 5

1、以只读方式(r模式)打开文件

  • open函数里有一个参数 mode,默认值是 r;
  • r :表示以只读的方式打开文件;如果要打开的文件不存在,会报错!!
# file = open('xxx.txt', mode='r')
file = open('demo.txt', encoding='utf-8', mode='r')
print(file.read())
# file.write('hello')   只读方式,不允许写入
  • 1
  • 2
  • 3
  • 4

2、以写的方式(w模式)打开文件

  • w: 表示以只写的形式打开文件;
  • 如果文件不存在,会创建文件;
  • 如果文件存在,会覆盖
  • 该模式打开文件时,不能读取,只能写入,且会覆盖
# file = open('xxx.txt', mode='w')
file = open('demo.txt', mode='w')
print(file.read())  # 不能读取
# file.write('hehe')  # 能写入。如果文件以前有内容,会覆盖
  • 1
  • 2
  • 3
  • 4

3、以追加方式(a模式)打开文件

  • a: 表示以追加的方式打开文件。
  • 如果文件存在,不做任何操作;
  • 如果文件不存在,会创建文件
  • 该模式打开文件时:不能读取,可以写入,且写入内容追加在最后
# file = open('demo.txt', mode='a')
# # print(file.read())  # 不能读取
# file.write('hehehe')  # 写入不会覆盖内容,而是在最后追加内容
  • 1
  • 2
  • 3

4、以文本形式(t模式)打开文件

  • t:表示以文本的形式打开文件。默认就是t,可以不写。 tr==>r tw==>w ta==>a(等价于)
file = open('demo.txt', 'tr')
print(file.read())
  • 1
  • 2

5、以二进制方式(b模式)打开文件

  • b: 表示以二进制的形式打开。 如果是以二进制的形式打开一个文件,此时不能再指定编码格式
file = open('IMG_0120.JPG', mode='rb') # 以二进制只读方式打开
print(file.read())
file.close() # 文件 打开后要关闭
  • 1
  • 2
  • 3

6、(rb模式)打开文件

  • 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。

二、文件路径

  • 路径表示: 可以使用 \  有风险   \ 在字符串里是转义字符;
    
    • 1
  • 推荐使用   /  而不是  \  作为路径的分割符
    
    • 1
  • ../  ==> 表示返回到上一级文件夹
    
    • 1
  • ./  ==> 表示的是当前文件夹,可以省略不写
    
    • 1
  • 相对路径:以 ./(可以省略) ../  或者文件(夹)开始的路径,相对的是当前文件所在的文件夹
    
    • 1
  • 绝对路径:  从电脑的盘符开始的路径
    
    • 1
file = open('xxx\nnn.txt')  # 对  \ 后面的字符进行转义
file = open('xxx\\nnn.txt')  # 可以使用两个斜杠
file = open(r'xxx\nnn.txt')  # 还可以在字符串前面加 r


# 推荐使用   /  而不是  \  作为路径的分割符
file = open('xxx/nnn.txt')
print(file.read())

#  ../  ==> 表示返回到上一级文件夹
file = open('../ppp.txt')
print(file.read())

# ./  ==> 表示的是当前文件夹,可以省略不写
file = open('./demo.txt')
print(file.read())

# 以 ./(可以省略) ../  或者文件(夹)开始的路径,我们可以称它为相对路径
# 相对的是当前文件所在的文件夹

# 绝对路径:  从电脑的盘符开始的路径
file = open(r'C:\Users\chris\Desktop\Day09\demo.txt')
print(file.read())


# 绝对路径!!!!
file = open('/demo.txt')
print(file.read())

  • 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

三、编码

1、字符编码

  • open时,如果不指定编码格式,默认的编码格式是None,表示使用操作系统默认的编码格式
  • Windows中文默认编码格式是GBK;如果换做Linux/MacOS 等系统,默认是utf-8
  • utf-8编码,一个字是3个字节,GBK编码,一个字是两个字节
# demo.txt文件写入时的编码格式是utf-8,读取时也只能使用utf-8读取
file = open('demo.txt', encoding='utf-8')
print(file.read())

# test.txt 文件写入时的编码格式是GBK,读取时也只能用GBK读取
# file = open('test.txt', encoding='GBK')  # 在Windows系统里,代码默认就是使用GBK读取文件的
file = open('test.txt')
print(file.read())

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2、读取文件编码格式

import chardet
file = open(r'C:\Users\ZhangYunyun\cabits_labeling.log.2021-07-23.txt', 'rb')
data = file.read()
print(chardet.detect(data))

结果:{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

四、文件读写操作

1、read 可以用来读取一个文件

  • 打开一个文件以后,需要根据打开的模式判断是否有读取或者写入权限
  • read() 读取所有的内容
  • read(size) 如果读取的是文本,单位是多少个文字,即字符的个数; 如果读取的是二进制,单位是字节
# 1、打开一个文件以后,需要根据打开的模式判断是否有读取或者写入权限
file = open('demo.txt', 'r', encoding='utf-8')
print(file.read(3))  # read可以指定读取的字符长度
file.close()

# 2、以二进制形式读取
file2 = open('IMG_0120.JPG', 'rb')
content = file2.read(1024)  # 如果是以二进制的形式读取,单位是字节
file2.close()

demo = open('IMG.jpg', 'wb')
demo.write(content) # 以二进制形式写入,该图片大小为1024字节,即1KB
demo.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2、读取大文件

  • 1)读取一个较大文件时:若不分片读,会很慢,可以每1KB读一次
file = open('big.file.mp4', 'rb')
while True:
    content = file.read(1024)
    if not content:
        break
    print(content)
file.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 2)读取多行文件时
  • readline()用来读取一行数据
  • readlines 把所有行的数据都读取,保存到一个列表里

file = open('demo.txt', 'r', encoding='utf-8')
print(file.readline()) # 打印文件中的第一行数据


lines = file.readlines() # 返回的是一个列表,即lines是一个列表,包括文件中的所有行数据
for line in lines:
    print(line, end='')
file.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3、文件写入

file = open('test.txt', 'wb')  # 以二进制形式写入
file.write(b'hello')  # 可以成功写入,b支持ASCII码表里的数据
# file.write(b'你好')  # 写入失败,不能直接把中文转换成二进制
file.write('你好'.encode(encoding='utf-8'))  # 写入成功
file.close()
  • 1
  • 2
  • 3
  • 4
  • 5

字符串、二进制转:
字符串转换成二进制,使用encode;
二进制转换成字符串,使用decode

print('你'.encode(encoding='utf-8'))
print(b'\xe4\xbd\xa0'.decode(encoding='utf-8'))

print('你'.encode(encoding='gbk'))
print(b'\xc4\xe3'.decode(encoding='gbk'))
  • 1
  • 2
  • 3
  • 4
  • 5

五、文件备份

可以先搭好框架:源文件二进制读、目标文件二进制写、关闭文件;
中间处理操作:名称分割

# 1、文件备份
file_name = input('请输入您要备份的文件名:')
# file_name = 'big.file.mp4'

# 需要复制的源文件
source_file = open(file_name, 'rb')  # 都以二进制都形式进行读写

# big.file.mp4 ==>big.file.bak.mp4,,,,源文件名称中有一个或多个.  备份文件名称想命名格式为:在后缀前加一个字符串
# names = file_name.split('.')  # ['big','file','mp4']

names = file_name.rsplit('.', maxsplit=1)  # ['big.file','mp4']
# print(names)  # ['big.file','mp4']

new_file_name = names[0] + '.bak.' + names[1]  # 备份的文件名称,

# 复制到的目标文件
dist_file = open(new_file_name, 'wb')

while True:
    content = source_file.read(1024) # 分片写入,以防文件过大写入困难
    dist_file.write(content)

    if not content:
        break

dist_file.close()
source_file.close()
  • 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
# 2、文件备份优化
while True:
    file_name = input('请输入您要备份的文件名:')

    try:
        source_file = open(file_name, 'rb')
        # break
    except FileNotFoundError:
        print('对不起,您输入的文件不存在!请重新输入:') # 然后做一个死循环(while),文件名称错误时,一直从新输入
    else:
        break

names = file_name.rsplit('.', maxsplit=1)

new_file_name = names[0] + '.bak.' + names[1]
dist_file = open(new_file_name, 'wb')

while True:
    content = source_file.read(1024)
    dist_file.write(content)

    if not content:
        break

dist_file.close()
source_file.close()

  • 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

六、异常处理

在程序运行的过程中,由于编码不够严谨或者一些无法避免的现象,程序可能会出错
在python里可以使用异常处理机制来解决程序运行过程中的异常
try except else

num1 = float(input('请输入一个数字除数:'))
num2 = float(input('请再输入一个数字被除数:'))

if num2 == 0:
    print('除数不能为0')
else:
    print('您输入的两个数字相除的结果是%.2f' % (num1 / num2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
p = {'name': 'zhagsan'}
num1 = input('请输入一个数字:')
num2 = input('请再输入一个数字:')

try:
    num1 = float(num1)
    num2 = float(num2)

    print('yes!!!!!!') # 程序一旦出问题,便会直接跳出try至except中,不会执行下面的语句,只有正常执行时才会打印该语句
    # print(p['age']) # 执行至该语句时,程序出错,会直接跳出try,执行except

    print(num1 / num2)
# except ValueError: # 只捕获指定异常
#     print('输入的不是数字!')
# except ZeroDivisionError:
#     print('除数不能为0!')
# except (ValueError, ZeroDivisionError):
#     print('程序出错了!!!')
except:
    print('程序出错了!!!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/181244?site
推荐阅读
相关标签
  

闽ICP备14008679号