如何最简单、通俗地理解Python的文件?


原文链接:https://www.zhihu.com/question/431437471/answer/1588566615

一、笔记

1) Python文件

① Python文件后缀一般以 .py 结尾。

② Python中,使用open函数,如果文件存在,则打开一个已经存在的文件,如果文件不存在,则新建一个文件。

③ open函数用法:open(name[,mode[,buffering[,encoding]]])

1. name:一个包含了你要访问的文件名称的字符串(区分绝对路径和相对路径)。
2. mode:mode决定了打开文件的模式:只读,写入,追加等。这个参数是非强制的,默认模式为只读(r)。
3. buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取为1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是寄存区的缓冲大小、如果取负值,寄存区的缓冲大小则为系统默认。
4. encoding:为编码格式,我们一般使用uft-8

④ 对文件的操作结束之后,使用close()来关闭文件,如果不关闭文件,就会一直占着内存。

# coding=utf-8
# 写文件                                  # 用写模式时,若有原文件,则内容会被清空,即写内容覆盖原内容
file = open('a.txt','w',encoding='utf-8') # 当前文件的同级路径下,新建(因为没有原文件)了一个 a.txt文件
file.write('aaa')                         # a.txt 文件中写入了 aaa
file.close()

 

# 文件追加内容
file = open('a.txt','a',encoding='utf-8')
file.write('bbb')                         # a.txt 文件中 aaa 末尾(不换行)追加了 bbb,变为 aaabbb
file.close()

 

# 以只读方式打开文件
file = open('a.txt','r',encoding='utf-8')
print(file.read())                        # 读出文件中的数据
# print(file.write('小王'))               # 只读模式下,写的话会报错
file.close()

运行结果:

aaabbb

# r+:读追加模式,先读,再追加
file = open('a.txt','r+',encoding='utf-8')
print(file.read())
file.write('小王')                        # 追加是在末尾追加,没有换行
print(file.read())                        # 第二行没有打印出来,为空白行,r+模式,追加后不能再读
file.close()

运行结果:

aaabbb小王
'空白行'

# w+:写读模式,先写,意味着原本内容丢失,只写不能读。
# w+:创建新文件,打开并写入数据,如果文件已存在,则覆盖写
file = open('a.txt','w+',encoding='utf-8')
file.write('小王')         # 原文件内容被覆盖,文件中内容仅有'小王'
print(file.read())         # 空白行,因为不能读
file.close()

运行结果:

'空白行'

# 读取上面w+写入的数据
file = open('a.txt','r',encoding='utf-8')
print(file.read()) 
file.close()

运行结果:

小王

2) 文件读写

① read(num):可以读取文件里面的内容。num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

② readlines():可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。如果想在with代码块外访问文件,就用readlines()从文件中读取每一行,将其存储在一个列表中。

③ 读取文本文件时,Python将其中的所有文本都解读成字符串。如果你读取的是数字,并要将其作为数值使用,就必须要使用函数int()将其转换成整数,或使用函数float()将其转换为浮点数。

④ 如果你要写入的文件不存在,函数open()将会自动创建它。我们使用文件对象的方法write()将一个字符串写入文件,这个程序是没有终端输出函数write()不会在你写入的文本末尾添加换行符,需要手动添加\n。

⑤ Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换成字符串格式。

⑥ flush()函数只与write()写文件有关,与读文件无关,flush()方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用flush()方法。

⑦ tell()函数返回文件游标的当前位置,以文件的开头为原点,当用追加'a'时,游标位置在文件末尾。

⑧ seek(offser[,whence]])函数:offset:一开始的偏移量,也就是代表需要偏移的字节数。whence:可选,默认值为0.给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从末尾算起。可以通过偏移在文件的任意位置写入数据。

⑨ 用with open 创建的文件,编码格式为函数中的utf-8,但如果是自己在文件夹中创建的文件,编码格式不一定是utf-8,所以用两种方式读取的文件,可能文件常用函数运行的情况不一样。

with open('a.txt','r',encoding='utf-8') as f:   # 等同于 f = open('a.txt','r',encoding='utf-8')
    print(f.readlines())

运行结果:

['小王']

with open('a.txt','a',encoding='utf-8') as f:   
    f.write('\naaa')   # 换行写入数据的用法,在写入数据前添加换行符,打印时换行符跟着上一行数据在列表中。

with open('a.txt','r',encoding='utf-8') as f:   
    print(f.readlines())

运行结果:

['小王\n', 'aaa']

file = open('a.txt','a',encoding='utf-8')
file.write('\n999') # write()    # 此语句运行完后,还没写入硬盘,也就是还没写进去
file.flush()                     # flush()运行完后,写入硬盘(即a.txt文件)了,平常flush()只有当close()关闭文件后,才写入硬盘。
file.close()

 

#coding=utf-8
with open('a.txt','r',encoding='utf-8') as f:
    print(f.readlines())
    print(f.tell())
    f.seek(5,0)
    print(f.read(2))
    print(f.tell())

3) with open语句

① 关键字with在不再需要访问文件后将其关闭,这可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。

② 可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close语句未执行,文件将不会关闭。

运行结果:

with open('a.txt','r',encoding='utf-8') as f:   # 等同于 f = open('a.txt','r',encoding='utf-8')
    print(f.read())

运行结果:

小王
aaa
999

4) 文件夹操作

① python编程时,经常和文件、目录打交道,这就离不开os模块。os模块包含普遍的操作系统功能,与具体的平台无关,linux系统、windows系统都有。

② os.getcwd()获得当前工作的目录。

③ os.listdir()指定所有目录下所有的文件和目录名。以列表的形式全部列举出来,其中没有区分目录(文件夹)和文件(py文件)。

④ os.remove()删除指定文件。

⑤ os.rmdir()删除指定目录。删除目录时,必须该目录下没有文件或文件夹,即空目录才可删除,非空目录不可删除,会报错。

import os

with open('a.txt','r',encoding='utf-8') as f:   # 当前文件的当前目录下有个   a.txt 文件
    print(f.read())                             # 读取当前文件的当前目录下的 a.txt 文件中内容

print(os.getcwd())                              # 获得当前文件的当前目录
print(os.listdir('C'))                          # 查看当前文件的同级目录下的C文件夹下有哪些目录和文件
print(os.listdir(os.getcwd()))                  # 查看当前文件的当前目录下有哪些目录和文件

运行结果:

小王
aaa
999
C:\Users\宝贝入怀\Desktop\10.11\00_git\02 Python难点
['CV.txt', '新建文件夹']
['.ipynb_checkpoints', 'a.txt', 'C', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']

import os

import os
file = open('a.txt','w',encoding='utf-8')       # 当前文件的同级路径下,新建(因为没有原文件)了一个 a.txt文件
file.write('aaa')                               # a.txt 文件中写入了 aaa
file.close()                                    # 如果不写 file.close() 无法后续进行 os.remove('a.txt') 操作,会报错,显示 a.txt 在另一个程序中运行。

print(os.listdir(os.getcwd()))                  # 查看当前文件的当前目录下有哪些目录和文件
os.remove('a.txt')                              # 删除当前目录下的'a.txt'文件
print(os.listdir(os.getcwd()))                  # 'a.txt'文件 已经被删除
os.rmdir('D')                                   # 删除D文件夹,这里只能删除空文件夹,如果文件夹里有东西,例如C文件夹,就不可以删除
print(os.listdir(os.getcwd()))                  # D文件夹 已经被删除

运行结果:

['.ipynb_checkpoints', 'a.txt', 'C', 'D', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']
['.ipynb_checkpoints', 'C', 'D', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']
['.ipynb_checkpoints', 'C', '新建文本文档.ipynb', '测试.ipynb', '第12天:面向对象.ipynb', '第13天:类.ipynb', '第14天:模块、包.ipynb', '第15天:路径、文件.ipynb', '第16天:闭包.ipynb', '第17天:装饰器.ipynb', '第18天:魔术方法.ipynb', '第19天:正则表达式.ipynb']

# os.rmdir(r'modpython\d')                 删除指定目录
# os.mkdir(r'modpython\d')                 创建目录,注意:这样只能建立一层,要想递归建立可用:os.makedirs()
# os.makedirs(r'modpython\d\c\v')          可以创建很多层文件夹,用的是递归创建的方法 
# os.path.isfile(r'modpython\d\c\v')       判断路径是否是一个文件,这是一个文件夹,所以不是文件
# os.path.isdir(r'modpython\d\c\v\a.txt')  判断路径是否为目录
# os.path.exists()                         判断文件或文件夹是否存在
# os.path.spilt()                          返回路径的目录和文件名
# os.system()                              执行shell命令,例如 os.system('cmd') 启动dos
# os.chdir()                               改变目录到指定目录
# os.path.getsize                          获取文件的大小,如果为目录,返回0
# os.path.abspath(r'modpython\d')          获得绝对路径,可以将相对路径补全
# 获取某个文件夹下所有文件名(不包括文件夹名)
import os
path = []
def check_file(dir_name):
    if os.path.isdir(dir_name):                      # 判断路径是否为目录
        for name in os.listdir(dir_name):            # 目录下所有文件和文件夹进行遍历,name 为输入目录下的文件和文件夹名称
            new_name = os.path.join(dir_name,name)   # 要把上一层的路径加进去,要不然在当前目录下搜索不到下一级的文件名或文件夹名
            
            if os.path.isdir(new_name):              # 如果是文件夹就递归
                check_file(new_name)
            else:
                path.append(os.path.abspath(new_name))
    else:
        path.append(os.path.abspath(dir_name))       # 如果该文件不是目录,则打印该文件的绝对路径

check_file('C')                                      # 这是一个相对路径的目录
print(len(path))                                     # 获得目录下有多少文件
print(path)                                          # 获得目录下的所有文件的绝对路径

运行结果:

2
['C:\\Users\\宝贝入怀\\Desktop\\10.11\\00_git\\02 Python难点\\C\\CV.txt', 'C:\\Users\\宝贝入怀\\Desktop\\10.11\\00_git\\02 Python难点\\C\\新建文件夹\\bv.txt']

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!

上一篇:Yann LeCun都推荐的深度学习资料合集!


下一篇:ipynb文件 转换为py文件