文件操作

方式一

f = open()    # f: 学名:文件操作符 或   文件句柄 或者 文件操作对象
f = open('file','w',encoding= ‘utf-8’)
#open打开文件是依赖了操作系统提供的途径
#操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码
#win系统  gbk    mac、Linux系统 utf-8 
mac, linux,打开python文件,默认utf-8,而python 3  默认是utf-8 所以用mac、Linux。系统的人  不用encoding='utf-8'
win系统打开python文件,默认gbk,而python 3 默认是utf-8,所以需要encoding='utf-8'

例如:我们用pycharm 编写代码的时候,默认使用utf-8方式编写内容,所以要先把打开的文件转换成utf-8格式,保证打开

的文件类型变成utf-8,和你将要以哪种(utf-8)保持一致,才行

例子,一篇文章,如果全是英语 ,你再往里面输入英文 英译汉 可以直接变成汉语

一篇文章,如果全是英语,你再往里面输入日语, 英译汉 就会出错

***只要写入的类型和打开的类型一致,不管什么操作系统都不会出错

文件句柄的几个方法

f.readable()    #判断文件是否可读

f.writable()     #判断文件是否可写

f.write('int')      #write()  写入的date 全是str      (打开文件的同时,文件被清空)
write()如果文件不存在,那么不存在的文件会被创建
----------

找到文件:
绝对路径: 文件路径要用取消转译的方式来表示(两种方法): 1. \\     2.r'path'
相对路径: 文件和py的 执行文件 在相同路径下,直接用文件的名字就可以
----------------------

f.close()   # 关闭文件 (操作系统级别的关闭)
del f         # 主动的释放了一个python程序内存中的变量     
(解释器会主动回收,所以可写可不写(例如:定义a = 1,b = 2,程序后面不用,解释器会主动回收,不过回收是需要时间的))
-------------------

f.read()     # 一次性读出文件的所有内容,   r 是按字符读,  rb 按字节读

f.read(n)    # 一次读n个字符

f.readline()    # 一次读一行,每次执行readline就会往下读一行 *** 不能直接读第二行
        print()本身就带换行符,而文件每行末尾也有换行符,就会造成输出一行字符一行空,一行字符一行空。。。
        print(1) ---------1\n
        print('1\n')------1\n\n
        所以加.strip(),把每行末尾的换行符去掉   (strip 能去掉空格、制表符、换行符)
    content = f.readline()
    print(content.strip())
    content = f.readline()
    print(content.strip())

f.readlines()        # 返回一个列表,将文件中的每一行作为列表的一个元素
                       # readlines有一个问题,如果文件有10g ,你的电脑内存就爆了

定位光标写入位置:

tell()      # 查看当前指针位置

seek(0)   # 把指针定位到文件开头
seek(0,2)   # 把指针定位到文件末尾

truncate(n)   # 截取从开头到n个字符(0--n),n以后的全部删掉 **必须是写入模式  ‘r+’  ‘a’  ‘a+’ ‘w’ ‘w+’    也就是除了'r'模式

 

一行一行的读取,几乎不占内存

for line i f:                   一次拿一行到内存    释放掉上一行
    print(line.strip())

例子:

有一个文件name:

apple 10 3
tesla 100000
mac 3000 2
lenovo 30000 3
chicken 10 3
phone 3 3000

f = open('name','r',encoding='utf-8')
dic = {}
shop_list = []
for i in f:
    if line.strip():          有空行的话,line.strip()就是  ''  空,空的bool值就是False,不执行
        dic1 = {'name':None,'price':None}
        li = i.split()
        dic1['name'] = li[0]
        dic1['price'] = li[1:]
        shop_list.append(dic1)
print(shop_list)
f.close()

读写参数:

w     # 以写方式打开,如果这个文件不存在,则创建这个文件,存在会被覆盖

r      # 以只读方式打开

x     # 如果文件存在,打开会引发异常

a    #  以写方式打开,写的内容追加在文章末尾(像列表的append())

b     # 表示二进制文件

+     # 以修改方式打开,支持读/写

r+    # 以读写模式打开

w+   # 以读写模式打开 (参见 w )

a+    # 以读写模式打开 (参见 a )

rb     # 以二进制读模式打开

wb    # 以二进制写模式打开 (参见 w )

ab     # 以二进制追加模式打开 (参见 a )

rb+   # 以二进制读写模式打开 (参见 r+ )

wb+  # 以二进制读写模式打开 (参见 w+ )

ab+  # 以二进制读写模式打开 (参见 a+ )

示例: 文件的修改

name文件内容
    aaaaaaa
    bbbbbbb
    cccccccc
-------------------------------
    
f = open('name','r',encoding='utf-8')    # 以 r 模式打开name文件
f1 = open('name1','w',encoding='utf-8')    # 以 w 模式创建 name1 文件
for line in f:
    line = line.replace('a','x')    #  把‘a' 替换成 x
    f1.write(line)   # 把修改后的字符串写入name1
f.close()
f1.close()    # 关闭文件
import os    # os模块
os.remove('name')    # 删除name文件
os.rename('name1','name')    # 把name1 文件改成原name文件
----------------------------------

name文件修改后的内容
    xxxxxxxx
    bbbbbbb
    xxxxxxxx
文件不能直接修改,可以把修改的内容存在另一个文件,把原文件删除,然后另一个文件改名字,间接完成修改

方式二

with语法,上下文管理

优点是不用手动关闭,且读取文件的过程中,不管是否发生错误,都会自动关闭文件

示例:

with 可以不用关闭文件
name文件
    xxxxxxxx
    bbbbbbb
    xxxxxxxx
-------------------------------------
    
with open('name','r',encoding='utf-8') as f,\
        open('name1','w',encoding='utf-8') as f1:
    for line in f:
        line = line.replace('x','a')
        f1.write(line)
import os
os.remove('name')
os.rename('name1','name')
---------------------------------------

name文件
    aaaaaaa
    bbbbbbb
    cccccccc

 

posted @ 2017-10-17 11:27  静静别跑  阅读(197)  评论(0编辑  收藏  举报