⽂件操作

本文详细介绍了Python中文件的各种操作方式,包括读取、写入、追加等不同模式下的使用方法,以及如何移动文件指针、修改文件内容等高级技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⼀. 初识⽂件操作

我们使⽤open()函数来打开⼀个⽂件, 获取到⽂件句柄,

⼆. 只读操作(r, rb)

 1. 相对路径, 相对于你当前程序所在的文件夹.(必须掌握)
#    ../ 返回上一层目录
#    相对的是当前程序所在的文件夹
 2. 绝对路径. 1.从磁盘根目录寻找. 2.互联网上的一个绝对路径
f = open("护⼠少妇嫩模.txt",mode="r", encoding="utf-8")  句柄
content = f.read()
print(content)
f.close()

  rb. 读取出来的数据是bytes类型 在rb模式下. 不能选择encoding字符集

f = open("护⼠少妇嫩模.txt",mode="rb" )
content = f.read()
print(content)
f.close()
结果:
b'\xe6\xaf\x85\xe5\x93\xa5, \xe5\xa4\xaa\xe7\x99\xbd,
wuse\n\xe5\x91\xb5\xe5\x91\xb5\n\xe6\x97\xa5\xe5\xa4\xa9'

注意:

1. read() 将⽂件中的内容全部读取出来. 
2.read(n) 读取n个字符. 需要注意的是. 如果再次读取. 那么会在当前位置继续去读⽽不
是从头读, 如果使⽤的是rb模式. 则读取出来的是n个字节
f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
content = f.read()
print(content)
结果:
友谊地久天⻓,
爱⼀点,
可惜我是⽔瓶座
⼀⽣中最爱


f = open("../def/哇擦.txt", mode="r" encoding="utf-8")
content = f.read(3)
print(content)
结果:
友谊地

f = open("../def/哇擦.txt", mode="rb")
content = f.read(3)
print(content)
结果:
b'\xe5\x8f\x8b'

f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
content = f.read(3)
content2 = f.read(3)
print(content)
print(content2)
结果:
友谊地
久天⻓

  3. readline() ⼀次读取⼀⾏数据注意: readline()结尾, 注意每次读取出来的数据都会有⼀ 个\n 所以呢.

   需要我们使⽤strip()⽅法来去掉\n或者空格

f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
content = f.readline()
content2 = f.readline()
content3 = f.readline()
content4 = f.readline()
content5 = f.readline()
content6 = f.readline()
print(content.strip())  将空格去掉
print(content2.strip())
print(content3)
print(content4)
print(content5)
print(content6)
结果:
友谊地久天⻓,
爱⼀点,
可惜我是⽔瓶座
⼀⽣中最爱

readlines()将每⼀⾏形成⼀个元素, 放到⼀个列表中. 将所有的内容都读取出来. 所以 也是. 容易出现内存崩溃的问题.不推荐使⽤

f = open('小护士模特',mode='r',encoding='utf-8')
s = f.readlines()
for line in s:
    print(line.strip())  去掉空格
f.close()
print(s)
结果为:
吉泽明步
科比
库里
詹姆斯
杜兰特
['吉泽明步\n', '科比\n', '库里\n', '詹姆斯\n', '杜兰特'] 把所有的元素都放到了一个列表中

5. 循环读取. 这种⽅式是组好的. 每次读取⼀⾏内容.不会产⽣内存溢出的问题.

f = open('小护士模特',mode='r',encoding='utf-8')
for line in f:
    print(line.strip())
结果:
吉泽明步
科比
库里
詹姆斯
杜兰特

注意: 读取完的⽂件句柄⼀定要关闭 f.close()

三. 写模式(w, wb)

写的时候注意. 如果没有⽂件. 则会创建⽂件, 如果⽂件存在. 则将文件中原来的内容删除, 再写入新内容

f = open('小护士模特',mode='w',encoding='utf-8')
# for line in f:
#     print(line.strip())
f.write('张无忌')
f.flush() # 刷新. 养成好习惯
f.close()     原来文件中的吉泽明步 科比 库里 詹姆斯 杜兰特已经被删除,变成了'张无忌'

wb模式下. 可以不指定打开⽂件的编码. 但是在写⽂件的时候必须将字符串转化成utf-8的 bytes数据

f = open('小护士模特',mode='wb')
# for line in f:
#     print(line.strip())
f.write('张翠山'.encode('utf-8')) 打开的是bytes,写入的时候必须转成'utf-8'
f.flush() # 刷新. 养成好习惯
f.close()
结果为:
张翠山   将文件中原来的内容已被删除 ,新内容为'张翠山'

四. 追加(a, ab) 在追加模式下. 我们写入的内容会追加在⽂件的结尾. 追加在'write'的时候追加

f = open('小护士模特',mode='a',encoding='utf-8')
# for line in f:
#     print(line.strip())
f.write('周芷若')
f.flush() # 刷新. 养成好习惯
f.close()

结果为:
张无忌
结果:
吉泽明步
科比
库里
詹姆斯
杜兰特周芷若    周芷若被加在了结尾

五. 读写模式(r+, r+b)

r+ 读写模式,需要移动光标进行反复读写.  

注意:对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进⾏写入.

正确操作是:

f = open('小护士模特',mode='r+',encoding='utf-8')
content = f.read()
f.write('灭绝')

print(content)
f.flush() # 刷新. 养成好习惯
f.close()

错误的操作:

f = open('小护士模特',mode='r+',encoding='utf-8')
f.write('灭绝')
content = f.read()
print(content)
f.flush() # 刷新. 养成好习惯
f.close()     将开头的内容改成了灭绝,此时光标在'绝',读取的是内容后面的内容,

六. 写读(w+, w+b)

先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常⽤

f = open('小护士模特',mode='w+',encoding='utf-8')
f.write('赵敏')
ss = f.read()
print(ss)

读到的内容为'空'  但是原来的文件已被改成'赵敏',其他的被清空

有⼈会说. 先读不就好了么? 错. w+ 模式下, ⼀开始读取不到数据. 然后写的时候再将原来的内容清空. 所以, 很少⽤.

七. 追加读(a+) a+模式下, 不论先读还是后读. 都是读取不到数据的.

f = open("⼩娃娃", mode="a+", encoding="utf-8")
f.write("⻢化腾")
content = f.read()
print(content)
f.flush()
f.close()

八. seek

seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中⽂部分要 是3的倍数.

移动到开头: seek(0)

f = open('小护士模特',mode='r+',encoding='utf-8')
f.seek(0)
ss = f.read()
print(ss)
读取的全部内容

移动到结尾: seek(0,2)    

f = open('小护士模特',mode='r+',encoding='utf-8')
f.seek(0,2)
ss = f.read()
print(ss)
移动到结尾,什么也没读到

移动到第二个字后面:

f = open('小护士模特',mode='r+',encoding='utf-8')
f.seek(6)  此时表示的byte,UTF-8的中⽂部分要 是3的倍数.
ss = f.write('***')

2. tell() 使⽤tell()可以帮我们获取到当前光标在什么位置

f = open('小护士模特',mode='r+',encoding='utf-8')
f.seek(6)
ss = f.write('***')
print(f.tell())

输出结果为:
9   表示此时贯标的位置是9byte,中⽂3 * 3个 = 9
如何判断这个文件可以进行什么操作
#  print(f.readable()) # 判断文件是否可读
#  print(f.writable()) # 是否可写入

3. truncate() 截断⽂件

f = open("马大帅", mode="r+", encoding="utf-8")
f.seek(12)
# f.truncate()    #  truncate() 不给参数. 从文件头.截取到当前光标的位置'seek'位置
f.truncate(15)  # truncate(参数) 给了参数. 从文件头截取到你给这个参数的位置
f.flush()
f.close()
深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显⽰的是多少. 再写入
或者操作⽂件的时候都是在结尾进⾏的操作. 

 

九. 修改⽂件以及另⼀种打开⽂件的⽅式

import os
with open("吃的", mode="r", encoding="utf-8") as f1, \
        open("吃的_副本", mode="w", encoding="utf-8") as f2:
    # s = f1.read()
    # ss = s.replace("肉", "菜")
    # f2.write(ss)
    for line in f1:
        s = line.replace("", "")
        f2.write(s)

os.remove("吃的") # 删除文件
os.rename("吃的_副本", "吃的")    # 重命名文件

 

转载于:https://www.cnblogs.com/shuai1993/p/9295695.html

1. 代码规范:类名采⽤驼峰命名法(如 ExamGenerator ),变量名⼩写加下划线(如 student_id )。 2. 账号管理:每个题⽬有两类⽤户,除了题⽬规定的功能外,为⽤户设计账号登陆退出功能。 3. 错误处理:操作包含 try-catch 块,捕获并提示 std::ios::failure 异常。 4. 测试⽤例:报告中为每个功能提供2个功能以上的测试⽤例。 题⽬1 “在线学习平台智能题库系统设计”  1. 问题描述  设计⼀个供教师和学⽣使⽤的智能题库系统,⽀持题⽬录⼊、智能组卷、学习数据分析功能。 2. 功能要求  1. 题库管理(教师端) 题⽬录⼊:教师通过命令⾏输⼊题⽬信息(题⼲、选项、答案、知识点标签、难度系数1-5),保存到 questions.txt ,格 式为: 题⽬修改:输⼊题⽬ID,⽀持修改题⼲或答案,修改后同步更新。 2. 智能组卷(教师端) 规则输⼊:教师输⼊知识点(如“继承”)、题⽬数量(如10题)、难度范围(如2-4),系统从题库中随机抽取符合条的题⽬ ⽣成试卷。 ⼿动调整:允许教师替换试卷中的题⽬,替换后⽣成新试卷 exam_001.txt3. 答题与评分(学⽣端) 答题:学⽣输⼊答案(如“A,B,C”),系统对⽐标准答案并计算得分。 成绩记录:将学⽣ID、得分、答题时间写⼊ scores.csv ,格式为: 4. 学习报告(学⽣端) 报告⽣成:每周⼀⾃动⽣成报告 report_20231001.txt ,内容包括: 3. 问题的解决⽅案  1. 类设计 Question 类: 属性: id , content , options , answer , tag , difficulty ⽅法: saveToFile() , loadFromFile() ExamGenerator 类: ⽅法: randomSelect(vector<Question>&, int count) , exportExam(string filename) Student 类: 属性: id , password [ID] 题⼲:C++中继承的三种类型是? 选项:A.公有 B.私有 C.保护 D.静态 答案:A,B,C 知识点:继承 难度:3 20231001,85,2023-10-01 14:30
最新发布
04-29
<think>好的,用户想了解文路径的相关概念、使用方法、常见问题及解决方案。我需要先理清文路径的基本概念,然后分绝对路径和相对路径来详细说明。记得结合用户提供的引用内容中的相关信息,比如引用[1]提到了相对路径和绝对路径的常见问题,引用[4]讨论了动态导入中的路径问题,这些都需要整合进来。 首先,文路径的基本概念。绝对路径是从根目录开始的完整路径,而相对路径是相对于当工作目录的路径。用户可能需要知道两者的区别和使用场景。然后,使用方法部分,需要给出具体的例子,比如在Python中如何表示路径,或者在配置文中如何设置路径。 接下来是常见问题,比如路径解析错误、相对路径在打包后失效、绝对路径的移植性问题,以及动态导入模块时的路径问题。这些问题在用户提供的引用中都有涉及,比如引用[4]提到PyInstaller打包时动态导入模块的路径问题,需要详细说明。 解决方案部分,需要针对每个问题给出具体的解决办法。例如,使用正确的路径分隔符,优先使用相对路径并明确基准目录,或者在打包工具中配置额外资源。同时,引用[2]中提到Vue项目中使用相对路径配置接口路径,这也是一个解决方案的例子。 还要注意用户提到的系统级指令,比如数学表达式用$...$格式,独立公式用$$...$$,但这个问题可能不需要数学公式,所以可能用不到。但需要确保回答结构清晰,分点列出,符合用户的要求。 最后生成相关问题,要围绕文路径的应用场景、不同系统中的路径处理、动态导入路径问题以及路径配置错误处理等方面提问。这样可以帮助用户进一步深入理解。 现在需要检查是否有遗漏的信息,比如引用[3]提到的MySQL的问题可能与路径关系不大,但可能涉及数据文路径的配置,但用户的问题主要关注文路径,所以可能不需要涉及。重点还是放在引用[1]、[2]、[4]的内容上。 总结,回答的结构应该是:概念、使用方法、常见问题及解决方案、相关问题。每个部分都要简明扼要,结合实例和引用中的内容,确保用户能够清晰理解并解决实际问题。</think>### 文路径详解 #### 一、文路径基本概念 文路径是操作系统中用于定位文或目录的字符串,分为**绝对路径**和**相对路径**: - **绝对路径**:从根目录开始的完整路径,例如:`C:/project/src/main.py`(Windows)或 `/usr/local/nginx.conf`(Linux/macOS) - **相对路径**:基于当工作目录的路径,例如:`./config/settings.json`(当目录下的文)或 `../data/input.csv`(上级目录中的文) #### 二、使用方法 1. **路径分隔符** - Windows使用反斜杠`\`,但编程中建议统一用正斜杠`/`以避免转义问题,例如:`"src/images/logo.png"` - Linux/macOS默认使用正斜杠`/` 2. **编程中的路径处理** ```python # Python示例:路径拼接 import os base_dir = "project" sub_path = os.path.join(base_dir, "data", "output.txt") # 自动处理系统差异 ``` 3. **配置文中的路径设置** - 端项目(如Vue)中接口路径配置可使用`./api/`表示当目录[^2] - CMake项目中通过`include_directories(${PROJECT_SOURCE_DIR}/include)`设置头文路径[^1] #### 三、常见问题与解决方案 | 问题类型 | 现象示例 | 解决方案 | |---------------------------|-----------------------------------|--------------------------------------------------------------------------| | 路径解析错误 | 打包后提示"文不存在" | 使用`os.path.dirname(__file__)`获取脚本所在目录作为基准路径 | | 相对路径基准不明确 | 执行位置改变导致路径失效 | 明确声明基准目录(如`BASE_DIR = Path(__file__).parent.parent`) | | 绝对路径移植性差 | 更换环境后路径失效 | 使用环境变量或配置文动态构建路径(如`${HOME}/.config/app_settings`) | | 动态导入模块路径问题[^4] | PyInstaller打包后模块加载失败 | 通过`--hidden-import`手动指定模块,或使用`sys._MEIPASS`处理冻结环境路径 | #### 四、进阶实践技巧 1. **路径规范化** ```python # 消除路径中的冗余部分 from pathlib import Path print(Path("src/../main.py").resolve()) # 输出绝对路径并解析`..` ``` 2. **跨平台兼容性** - 使用`pathlib`库代替字符串操作 - 处理特殊字符(如空格需转义为`\ `或加引号`"Program Files"`) 3. **调试建议** - 打印当工作目录:`print(os.getcwd())` - 检查路径是否存在:`Path("data").exists()`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值