如何最简单、通俗地理解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大家一起来学习讨论吧!

学习Python基础,尤其是寻找通俗易懂的教程或资料,可以从以下几个方面入手: ### Python基础学习的建议 1. **选择适合零基础的教程** 对于初学者,推荐选择系统性强、讲解细致的教程。例如,可以选择《史上最全Python入门基础教程(保姆级教程)》这样的内容,它不仅涵盖Python的基础语法,还详细讲解了编程思维和实际应用案例。这种教程适合零基础的小白,能够循序渐进地掌握Python的核心知识[^3]。 2. **注重代码实践** 学习编程离不开动手实践。可以参考一些手把手教学的教程,比如“自动化之python基础,0基础手把手教学,最细的教程通俗易懂”。这类教程通常会结合实际案例,比如通过`if...else`语句来模拟生活中的决策逻辑,帮助初学者理解程序的运行机制[^4]。 3. **掌握基础语法与结构** Python的语法简洁清晰,采用缩进表示代码块。例如,以下是一个简单的条件判断示例: ```python money = 10 if money > 20: print('买盒利群') else: print('买煊赫门') ``` 这种直观的代码结构使得编程更加容易理解和学习[^4]。 4. **利用丰富的学习资源** Python拥有庞大的社区支持,提供了丰富的教程、文档和在线资源。可以参考一些优质的学习平台,例如知乎、优快云、掘金等,这些平台上有许多针对初学者的Python教程,涵盖从基础语法到高级应用的各个方面[^3]。 5. **学习Python的内置功能和第三方库** Python内置了丰富的数据类型和库,支持多种编程范式,如面向过程、面向对象和函数式编程。此外,Python还有大量的第三方库,如NumPy、Pandas、Django、Flask等,这些库和框架大大扩展了Python的应用范围,提高了开发效率[^3]。 6. **避免盲目自学** 对于零基础的学习者来说,不建议在网上随意查找资料自学,因为现在网上的Python爬虫教程虽多,但真正面向零基础的却不多。建议选择系统性强、有专业老师指导的课程,这样不仅能够学习Python爬虫,还能掌握其他Python相关的内容,提升工作前景[^2]。 7. **关注学习路径** 在学习Python基础时,可以按照以下路径进行: - **基础语法**:包括变量、数据类型、运算符、流程控制(如条件语句、循环语句)等。 - **函数与模块**:学习如何定义和调用函数,以及如何使用模块来组织代码。 - **数据结构**:掌握列表、元组、字典、集合等常用数据结构。 - **文件操作**:学习如何读写文件,处理文本数据。 - **面向对象编程**:理解类和对象的概念,掌握封装、继承、多态等特性。 - **异常处理**:学习如何处理程序中的错误和异常。 - **常用库的使用**:如NumPy、Pandas等,提升数据处理能力[^3]。 ### 推荐的学习资源 - **书籍**:《Python编程:从入门到实践》、《Python核心编程》等。 - **在线课程**:B站上的“史上最全Python入门基础教程(保姆级教程)”、知乎上的“通俗易懂的Python入门基础详细教程”等。 - **社区**:Stack Overflow、GitHub、Python官方文档等,这些都是解决编程问题的好去处。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值