Python:读写文件(I/O) | 组织文件
1. I/O 概述
程序与用户交互涉及到程序的输入输出(I/O)
一种类型是字符串,通过input() 和 print() 函数以及数据类型转换类函数如(int()),实现数据的输入输出。
另一种类型是读写文件,通过文件的创建、读和写,实现数据的输入输出。
本文叙述关于读写文件与组织文件
2. 文件与文件路径
2.1 文件及文件类型
2.1.1 文件
文件是一个位的序列,可被应用程序翻译成文本文件和二进制文件。
位是存储在计算机中的最小单位,位代表设备的某一状态,但只能是两种状态之一(设备开关断开或合上)。
文件可分类为文本文件和二进制文件
2.1.2 文本文件
文本文件是字符文件,只含有ASCII或Unicode字符,要存储整数、浮点数或其他数据结构,必须要将它们转化成对应的字符格式。
2.1.3 二进制文件
二进制文件是其他所有文件。诸如字处理文档、 PDF、 图像、 电子表格和可执行程序。
2.2 文件路径
文件以文件夹 (folder)的形式组织起来。文件夹也叫目录(directory)。
每个正在运行的程序都有一个 ‘‘当前目录”作为大多数操作的默认目录。例如,当你打开一个文件来读取时,Python 会在当前目录下寻找这个文件。
指明一个文件或者目录的字符串,叫做路径 (path),比如:'/Python36/scripts'
os 模块提供了操作文件和目录的函数。
2.2.1 相对路径
一个简单的文件名,如 memo.txt ,同样被看做是一个路径,只不过是相对路径 ,因为它是相对于当前目录而言的。相对路径(relative path)就是从当前目录开始的路径。
下面代码揭示了 os.path.exists() 的实际
>>> import os
>>> os.getcwd() # getcwd() 返回当前工作目录
'D:\\Python36'
>>> os.chdir('C:\\Windows\\System32') # chdir() 切换当前目录
>>> os.getcwd()
'C:\\Windows\\System32'
>>> import os
>>> os. path . exists ('(读写文件)疯狂填词2.txtt ') # 这个文件在计算机上存在,但不存在当前目录
False
>>> os.path.exists('正则代码实践strip.py') # 这个文件存在当前目录
True
2.2.2 绝对路径
一个以 / 开头的路径和当前目录无关,叫做绝对路径 。绝对路径 (absolute path)就是从文件系统顶部开始的路径。
下面代码揭示了 os.path.abspath() 的实际效果以及 os.path.relpath() 的用法
>>> import os
>>> os.path.abspath('正则代码实践strip.py')
'D:\\Python36\\正则代码实践strip.py'
>>> import os
>>> os.path.abspath('正则代码实践strip.py')
'D:\\Python36\\正则代码实践strip.py'
>>> os.path.abspath('(读写文件)疯狂填词2.py') # 这个文件是当前目录没有的
'D:\\Python36\\(读写文件)疯狂填词2.py'
>>> os.path.abspath(r'\Python编程快速上手++让繁琐工作自\(读写文件)疯狂填词2.py') # 这个目录也是当前目录不存在的
'D:\\Python编程快速上手++让繁琐工作自\\(读写文件)疯狂填词2.py'
>>> os.path.abspath(r'\Desktop\Python编程快速上手++让繁琐工作自动化\(读写文件)疯狂填词2.py')
'D:\\Desktop\\Python编程快速上手++让繁琐工作自动化\\(读写文件)疯狂填词2.py'
>>> os.path.abspath(r'\Administrator\Desktop\Python编程快速上手++让繁琐工作自动化\(读写文件)疯狂填词2.py')
'D:\\Administrator\\Desktop\\Python编程快速上手++让繁琐工作自动化\\(读写文件)疯狂填词2.py' # 如果没有指明最顶部根目录,则该函数返回的目录的顶部都是当前目录的顶部,即"D:\\"
>>> os.path.abspath(r'C:\Users\Administrator\Desktop\Python编程快速上手++让繁琐工作自动化\(读写文件)疯狂填词2.py')
'C:\\Users\\Administrator\\Desktop\\Python编程快速上手++让繁琐工作自动化\\(读写文件)疯狂填词2.py'
>>> import os
>>> os.path.relpath('C:\\Windows', 'C:\\')
'Windows'
>>> os.path.relpath('C:\\Windows', 'C:\\spam\\eggs')
'..\\..\\Windows'
>>> os.getcwd()
'D:\\Python36'
2.2.3 用 os.makedirs() 创建新文件夹(目录)
os.makedirs()将创建所有必要的中间文件夹,目的是确保完整路径名存在。
>>> import os
>>> os.makedirs('D:\\abc\\def\\g')
>>> os.chdir(('D:\\abc\\def\\g')
2.2.4 用 os.path.join() 构建所有操作系统上都有效的路径
这个方法很有用,例如构建文件路径(创建文件的同时创建路径)
>>> import os
>>> os.path.join('D:\\Python36', 'test.txt')
'D:\\Python36\\test.txt'
3. 读写文件
3.1 用 open() 函数创建或打开文件
open() 函数返回一个 File 类型对象,将该对象保存于变量中,就可以调用 File 对象的方法
>>> file = open('hello.txt')
如果当前目录下没有 'hello.txt' 文件,则创建该文件并打开。
3.2 用 read() 或 readlines()方法读取文件
open() 函数默认以“读”模式打开文件,因此不能进行写入操作,但可以用 read() 方法读取文件内容(但要实现下面代码结果,先要手动打开文件,并敲入对应的内容),
read() 方法就返回保存在该文件中的字符串。
readlines() 方法,从文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。
>>> helloContent = file.read()
>>> helloContent
'Hello world!'
>>> sonnetFile = open('sonnet29.txt')
>>> sonnetFile.readlines()
[When, in disgrace with fortune and men's eyes,\n', ' I all alone beweep my
outcast state,\n', And trouble deaf heaven with my bootless cries,\n', And
look upon myself and curse my fate,']
3.3 用 write()方法写入文件
将'w'作为第二个参数传递给 open(),将以写模式打开该文件,便可以调用 write() 方法将内容写入文件。
'w' 模式将会删除文件原有内容,重新写入。
如果不希望删除原有内容,可以用 'a' 模式将内容以添加的方式写入文件。
还有二进制写入模式 'wb' 等,更多模式请参考Python文档。
>>> baconFile = open('bacon.txt', 'w')
>>> baconFile.write('Hello world!\n')
13
>>> baconFile.close()
>>> baconFile = open('bacon.txt', 'a')
>>> baconFile.write('Bacon is not a vegetable.')
25
>>> baconFile.close()
>>> baconFile = open('bacon.txt')
>>> content = baconFile.read()
>>> baconFile.close()
>>> print(content)
Hello world!
Bacon is not a vegetable.
write() 返回值是被写入字符的个数。文件对象将跟踪自身的位置,所以下次你调用 write的时候,它会在文件末尾添加新的数据。
3.4 修改文件
调用 readlines() 方法,利用正则表达匹配修改内容或调用字符串相关方法修改内容,重新写入新文件。备份原文件,删除原文件。
3.5 用 colse() 方法关闭文件
如果用上下文管理器(with语句)则不需要调用colse()方法,否则应该在最后调用colse()方法。
>>> baconFile = open('bacon.txt', 'w')
>>> baconFile.write('Hello world!\n')
13
>>> baconFile.close()
4. 组织文件
参考自《Python编程快速上手 让繁琐工作自动化》
4.1 查看目录下所有文件
调用 os.listdir(path) 将返回传入函数路径(path)下所有文件名字符串的列表,包含 path 中的每个文件
>>> os.listdir('C:\\Windows\\System32')
['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll',
......
'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll']
4.2 遍历目录树
os.walk()在循环的每次迭代中,返回 3 个值:
1. 当前文件夹名称的字符串。
2. 当前文件夹中子文件夹的字符串的列表。
3. 当前文件夹中文件的字符串的列表。
import os for folderName, subfolders, filenames in os.walk('C:\\delicious'):
print('当前目录(文件夹) folder 是 ' + folderName)
for subfolder in subfolders:
print('目录下子文件夹 subflder 是 ' + folderName + ': ' + subfolder)
for filename in filenames:
print('目录下文件 file 是 ' + folderName + ': '+ filename)
print('')
输出如下,意思就是os.walk(),先搜索文件夹(根目录)下的所有子文件夹和文件,而对根目录下的每个子文件夹又做了同样的事情,层次迭代,结果就是找到了所有的文件夹与文件(即遍历了目录树)
当前目录文件夹 folder 是 C:\delicious
目录下子文件夹 subflder 是 C:\delicious: cats
目录下子文件夹 subflder 是 C:\delicious: walnut
目录下文件 file 是 C:\delicious: spam.txt 当前目录文件夹 folder 是 C:\delicious\cats
目录下文件 file 是 C:\delicious\cats: catnames.txt
目录下文件 file 是 C:\delicious\cats: zophie.jpg 当前目录文件夹 folder 是 C:\delicious\walnut
目录下子文件夹 subflder 是 C:\delicious\walnut: waffles
当前目录文件夹 folder 是 C:\delicious\walnut\waffles
目录下文件 file 是 C:\delicious\walnut\waffles: butter.txt.
4.3 shutil 模块
4.3.1 复制文件和文件夹
调用 shutil.copy()
>>> import shutil, os
>>> os.chdir('C:\\')
>>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
'C:\\delicious\\spam.txt'
>>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')
'C:\\delicious\\eggs2.txt'
4.3.2 文件和文件夹的移动与改名
调用 shutil.move(source, destination), 下面代码:
1、如果文件夹 C:\eggs 中原来存在一个文件 bacon.txt,它会被C:\\bacon.txt 覆盖(替换)。
2、目标文件夹 C:\\eggs 必须存在
3、 shutil.move() 方法可以实现改文件名
>>> import shutil
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs')
'C:\\eggs\\bacon.txt'
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs\\new_bacon.txt')
'C:\\eggs\\new_bacon.txt'
4.3.3永久删除文件和文件夹
利用 os 模块中的函数,可以删除一个文件或一个空文件夹。但利用 shutil 模块,可以删除一个文件夹及其所有的内容。
• 调用 os.unlink(path)将删除 path 处的文件。
• 调用 os.rmdir(path)将删除 path 处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
• 调用 shutil.rmtree(path)将删除 path 处的文件夹,它包含的所有文件和文件夹都会被删除。
以上函数都是永久删除用时要特别小心
import os
for filename in os.listdir():
if filename.endswith('.rxt'):
#os.unlink(filename)
print(filename)
4.3.4 用 send2trash 模块安全地删除
send2trash() 函数只能将文件送到垃圾箱, 不能从中恢复文件。
>>> import send2trash
>>> baconFile = open('bacon.txt', 'a') # creates the file
>>> baconFile.write('Bacon is not a vegetable.')
25
>>> baconFile.close()
>>> send2trash.send2trash('bacon.txt')
4.4.zipfile 模块
4.4.1 读取 ZIP 文件
>>> import zipfile, os
>>> os.chdir('C:\\') # move to the folder with example.zip
>>> exampleZip = zipfile.ZipFile('example.zip')
>>> exampleZip.namelist()
['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg']
>>> spamInfo = exampleZip.getinfo('spam.txt')
>>> spamInfo.file_size
13908
>>> spamInfo.compress_size
3828
>>> 'Compressed file is %sx smaller!' % (round(spamInfo.file_size / spamInfo.compress_size, 2))
'Compressed file is 3.63x smaller!'
>>> exampleZip.close()
4.4.2 解压文件
运行这段代码后, example.zip 的内容将被解压缩到 C:\。
或者, 你可以向extractall()传递的一个文件夹名称,它将文件解压缩到那个文件夹, 而不是当前工作目录。
>>> import zipfile, os
>>> os.chdir('C:\\') # move to the folder with example.zip
>>> exampleZip = zipfile.ZipFile('example.zip')
>>> exampleZip.extractall()
>>> exampleZip.close()
4.4.3 创建和添加到 ZIP 文件
下面代码 zipfile.ZipFile()方法中第二个参数 zipfile.ZIP_DEFLATED 是指定了 deflate 压缩算法,它对各种类型的数据都很有效
这段代码将创建一个新的 ZIP 文件, 名为 new.zip, 它包含 spam.txt 压缩后的内容。
和写入文件同样,写模式将擦除 ZIP 文件中所有原有的内容。如果只是希望将文件添加到原有的 ZIP 文件中, 就要向 zipfile.ZipFile()传入'a'作为第二个参数,以添加模式打开 ZIP 文件
>>> import zipfile
>>> newZip = zipfile.ZipFile('new.zip', 'w')
>>> newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)
>>> newZip.close()
Python:读写文件(I/O) | 组织文件的更多相关文章
- python读写操作csv及excle文件
1.python读写csv文件 import csv #读取csv文件内容方法1 csv_file = csv.reader(open('testdata.csv','r')) next(csv_fi ...
- python读写hdf5及cdf格式文件
Python write and read hdf5 file http://stackoverflow.com/questions/20928136/input-and-output-numpy-a ...
- Python IO编程-组织文件
对于日常中遇到的批量任务,有些可以通过请求python完成自动化,我非常渴望拥有这些能力,在去年学习了python读写文件之后,我马上迫不及待的开始学习‘组织文件’,经过学习,我发现python组织文 ...
- Python 读写文件的正确方式
当你用 Python 写程序时,不论是简单的脚本,还是复杂的大型项目,其中最常见的操作就是读写文件.不管是简单的文本文件.繁杂的日志文件,还是分析图片等媒体文件中的字节数据,都需要用到 Python ...
- Python读写文件
Python读写文件1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('t ...
- 用Python读写Excel文件(转)
原文:google.com/ncr 虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TA ...
- python 读写、创建 文件
python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...
- python 读写文件和设置文件的字符编码
一. python打开文件代码如下: f = open("d:\test.txt", "w") 说明:第一个参数是文件名称,包括路径:第二个参数是打开的模式mo ...
- python读写操作文件
with open(xxx,'r,coding='utf-8') as f: #打开文件赋值给F ,并且执行完了之后不需要 f.close(). 在Python 2.7 及以后,with又支持同时 ...
随机推荐
- c语言:分治算法之大数相乘
我们把整数A由规模n分为n1和n2,把整数B由规模m分为m1和m2,如下图: 则A分为n1位的A1和n2位的A1,B分为m1位的B1和m2位的B2,如下式所示: 以此类推,我们可以把A1.A2.B1. ...
- Python3+PYQT5 实现并打包exe小工具(1)
前言: 由于项目原因,配置测试环境与正式环境切换频率很高,固写了一键切换环境的工具.用于记录. 实现逻辑: 1.读取注册表中客户端的安装目录,把固定的环境配置文件添加到固定目录下实现配置测试环境: 2 ...
- python行与列显示不全
在显示数据框时添加以下代码 #显示所有列 pd.set_option('display.max_columns', None) #显示所有行 pd.set_option('display.max_ro ...
- DRF的封装:APIView类及五大模块
目录 一.drf框架的封装特点 1.APIView类 二.drf的基础组件 1.请求模块 1.1 请求模块做了什么 1.2 请求request参数 2.解析模块 3.响应模块 4.渲染模块(了解) 5 ...
- Svelte 极简入门
弹指之间即可完成. 注意:原文发表于 2017-8-7,随着框架不断演进,部分内容可能已不适用. Svelte 是一种新型框架. 以往我们要引入一个框架或者类库,可以通过在页面上放置 ...
- MySQL注入 前端int型参数插入SQL语句
类似PHP语言的 mysql_real_escape_string() 的函数,在用来防范SQL注入的时候,可能会遇到int型注入成功的情况. mysql_real_escape_string()用法 ...
- 基于 vagrant搭建移动端的开发环境
# 后端开发环境Homestead启动 Homestead 之前,确保 VirtualBox .Vagrant.Git 软件己安装. ## 安装 laravel/homesteadvagrant bo ...
- Windows下用户手册
(1)net user(查看系统用户) (2)net user 用户名(查看具体某个系统用户详细信息) (3)net user 用户名 密码 /add(在本地组成员创建新用户,此时为Users组) ...
- IDEA的下载、安装与破解
IDEA的下载.安装与破解 下载地址:https://www.jetbrains.com/idea/download/#section=windows 建议下载2018.2版本,方便破解 安装 一直下 ...
- Codeforces 1015E1 Stars Drawing (Easy Edition)
题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...