day9---文件操作

1. 初识文件处理

  • python中的文件操作步骤:打开文件、操作文件、关闭文件。

  • 需要操作的文件与py的执行文件在相同路径下时,直接指定文件名即可,如果不在同一目录时,需要指定所操作文件的绝对路径。

  • 指定文件的绝对路径时,需要取消转译的方式来表示:1(\),2(路径前的括号前加r)。

  • 文件操作需要指定文件的操作句柄,又叫文件操作符、文件操作对象。

  • del f:主动释放一个python程序中内存中的变量,可写看不写,程序执行完会自动释放。

  • python中打开文件的方法是open,open('文件名','打开模式,'文件编码')

  • python中打开文件的模式是只读('r')

  • python中打开文件的默认编码是操作系统的默认编码

  • 判断文件是否可读:readable()

f = open('yan', 'r', encoding='utf-8')
print(f.readable())
print(f.writable())
f.close()
>>>
True
False
  • 判断文件是否可写:writable()

f = open('yan', 'w', encoding='utf-8')
print(f.readable())
print(f.writable())
f.close()
>>>
False
True
  • python中关闭文件使用close()

  • 打开的文件不会自动关闭,必须使用close()方法关闭

  • 不管是读文件还是写文件,都会识别换行符

  • python中的文件操作没有修改和删除的方法,只能通过其他操作途径来做

2. 文件写操作

  • 文件操作写模式使用:w,以w的方式打开一个文件,如果文件不存在,会自动创建此文件;如果文件存在,先清空文件内容,再往里写数据。

f = open('yan', 'w', encoding='utf-8')
f.write('liyan')
f.write('888')
f.write('\n岩哥')
f.close()
>>>(文件内容)
liyan888
岩哥

3. 文件读操作

  • 文件操作读模式使用:r,默认文件操作的打开方式是(r),所以r可写可不写
  • 读文件的第一种方式:使用read()方法一次性读出文件中的所有内容

f = open('yan', 'r', encoding='utf-8')
print(f.read())
>>>
liyan
888
岩哥
  • 读文件的第二种方式:使用read(n)可以指定读取文件中n个单位

f = open('yan', 'r', encoding='utf-8')
print(f.read(3))
>>>
liy
  • 读文件的第三种方式:使用readline()逐行读取文件中的内容

f = open('yan', 'r', encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.readline())
>>>
liyan
888
岩哥
  • 读文件的第四种方式:使用readlines()返回一个列表。把内容中所有内容都读取出来,并把每一行当作一个元素加入到列表中显示出来,每一个元素都会有一个'\n'换行符

f = open('yan', 'r', encoding='utf-8')
print(f.readlines())
>>>
['liyan\n', '888\n', '岩哥']
  • 读文件的第五种方式:也是最常用的一种方式,直接以for循环的方式读取出文件中每一行的内容。使用strip()方法,可以过滤空行,只显示文件中有内容的行

f = open('yan', 'r', encoding='utf-8')
for line in f:
    print(line.strip())
>>>
liyan
888
岩哥

4. 文件处理模式

  • a:以追加的方式把内容写到文件最后(一定注意换行符的合理使用)

f = open('yan', 'a', encoding='utf-8')
f.write('这是追加的内容')
f.write('\n注意换行符')
>>>(文件内容)
liyan
888
岩哥这是追加的内容
注意换行符
  • rb、wb、ab:以二进制的方式读、写、追加文件操作。一般操作图片、音频、视频等文件时用到,在网络编程时,或数据传输(上传、下载)时居多,默认是以二进制的方式操作文件,所以在打开文件时就不需要再指定文件编码了。

  • r+:可读可写(1.先读后写,写是追加;2.先写后读,从头开始写)

  • w+:可写可毒,其实就是直接把文件清空(1.尽管可读,但是读取的都是当前打开后新写入文件的内容;2.光标的最后,读取的信息为空,需要主动移动光标才可度到文件内容)

  • a+:追加可读(在文件最后追加内容,但是读取只仍需要移动光标才可以读取)

  • 常用的文件操作,要么读、要么写、要么追加,很少用到读写、写读同时使用的情况。常用的有:r、w、a、rb、wb、ab

5. 文件内的光标移动

  • seek:光标移动到第几个字节的位置

    • f.seek(0):移动到文件内容最开始的位置
    • f.seek(0,2):移动到文件内容最结尾的位置
  • tell:输出当前光标位置在第几个字节

  • truncate(n):指定文件中保留n个字节,其他的全部清除

6. 文件的修改操作

  • 创建一个新文件

  • 把原文件的内容读取出来

  • 把读取的文件内容做修改操作

  • 把修改后的文件内容写入到新文件中

  • 删除原文件,重命名新文件名

  • 示例:

# 替换原文件yan.txt的'原来'为'新','old'为'new'
# 下列是原文件yan.txt中的内容
"""
原文件中的内容:
old file content
"""
# 导入os模块用于调用系统命令
import os
# 1. 创建一个新文件
fw = open('yan_new.txt', 'w', encoding='utf-8')
# 2. 把原文件的内容读取出来
fr = open('yan.txt', encoding='utf-8')
for i in fr:
    if i.strip():
        # 3. 把读取的文件内容做修改操作
        old_content = i.replace('原', '新').replace('old', 'new')
        # 4. 把修改后的文件内容写入到新文件中
        fw.write(old_content)
fr.close()
fw.close()
# 5. 删除原文件,重命名新文件名
os.remove('yan.txt')
os.rename('yan_new.txt', 'yan.txt')
>>>(执行代码后新文件[文件名不变]的内容)
新文件中的内容:
new file content

7. 文件删除操作

  • 文件删除操作需要调用系统命令

  • 文件删除跟文件修改的最后一步一样,直接导入os模块,然后使用系统命令os.remove即可

  • 示例:

import os
os.remove('yan.txt')
>>>
# 当前目录下yan.txt已经不存在了

8. with语句操作文件

  • with语句等于文件的打开和关闭

  • with语句不需要close()关闭文件

  • 示例:

with open('yan.txt', encoding='utf-8') as f:
    for i in f:
        print(i.strip())    
>>>
with...
# 替换原文件yan.txt的第二个old为new
# 下列是原文件yan.txt中的内容
"""
1.old的内容
2.old....
3.the old...
"""
import os
with open('yan.txt', encoding='utf-8') as f, open('yan_new.txt', 'w', encoding='utf-8') as fw:
    count = 0
    for i in f:
        if i.strip() and count == 1:
            new_content = i.replace('old', 'new')
            fw.write(new_content)
        else:
            fw.write(i)
        count += 1
os.remove('yan.txt')
os.rename('yan_new.txt', 'yan.txt')
>>>(执行代码后新文件[文件名不变]的内容)
1.old的内容
2.new....
3.the old...

9. 文件操作应用

'''
如下是文件shopping中的内容,分别使用列表嵌套字典和字典嵌套列表的方式读取出来。
apple 10 3

tesla 100000 1

mac 3000 2

lenovo 30000 3

chicken 10 3
'''
# (1) 列表嵌套字典:
f = open('shopping', encoding='utf-8')
goods_list = []
for i in f:
    goods_dict = {}
    i = i.strip()
    if i:
        # print(i)
        goods_list_tmp = i.split()
        # goods_dict[goods_list_tmp[0]] = goods_list_tmp[1:]
        goods_dict['name'] = goods_list_tmp[0]
        goods_dict['price'] = goods_list_tmp[1]
        goods_dict['number'] = goods_list_tmp[2]
        goods_list.append(goods_dict)
print(goods_list)
>>>
[{'name': 'apple', 'price': '10', 'number': '3'}, {'name': 'tesla', 'price': '100000', 'number': '1'}, {'name': 'mac', 'price': '3000', 'number': '2'}, {'name': 'lenovo', 'price': '30000', 'number': '3'}, {'name': 'chicken', 'price': '10', 'number': '3'}]
# (2) 字典嵌套列表:
f = open('shopping', encoding='utf-8')
goods_dict = {}
for j in f:
    j = j.strip()
    if j:
        goods_list = j.split()
        goods_dict[goods_list[0]] = goods_list[1:]
print(goods_dict)
>>>
{'apple': ['10', '3'], 'tesla': ['100000', '1'], 'mac': ['3000', '2'], 'lenovo': ['30000', '3'], 'chicken': ['10', '3']}
posted @ 2017-10-30 19:16  _岩哥  阅读(290)  评论(0)    收藏  举报