python 建立文件夹-python建立包
1、永久保存
当我们谈到“永久存储”时python 建立文件夹,我们希望将数据保存到硬盘中,而不是内存中,因为计算机断电后数据就会丢失。
2.打开文件
要用 Python 打开一个文件,我们需要使用 open() 函数:
>>> f = open("FishC.txt", "w")
第一个参数指定文件路径和文件名。 如果我们这里不加路径,默认是在Python的主文件夹下创建文件,因为执行IDLE的程序就放在那里(同理,如果我们在桌面创建一个test.py源文件,然后输入代码打开文件,然后会在桌面上创建一个FishC.txt文本文件)。
第二个参数是指定文件的打开方式:
3、文件对象方法详解
(1) 向文本对象写入字符串有两种方法,一种是write(),一种是writelines():
>>> f.write("I love Python.")
14
使用 write() 方法,它有一个返回值,即写入文件对象的字符总数。
使用 writelines() 方法,可以同时写入多个字符串:
>>> f.writelines(["I love FishC.\n", "I love my wife."])
>>>
注意:writelines()方法虽然支持传入多个字符串,但是不会给你加换行,所以要自己加。 [/代码]
4.关闭文件
我们使用 close() 方法关闭文件:
>>> f.close()
>>>
请注意,文件对象关闭后,我们无法对其进行操作。
如果我们想继续使用该文件,我们必须重新打开它。
5.路径修改
不同的操作系统有不同的路径分隔符。 例如,Windows 系统使用反斜杠,而大多数其他操作系统使用斜杠来分隔它们。
Windows使用的反斜杠与字符串中的转义字符是同一个反斜杠,所以如果你想在Windows上使用反斜杠分隔路径,你必须使用另一个反斜杠斜杠来转义反斜杠,或者使用原始字符串,不是这样的很难做到,只是觉得没有那么优雅……
6.相对路径和绝对路径
相对路径:以当前目录为基础,逐级推导(..表示上级目录;..当前目录)。
绝对路径:文件实际存在的路径,从根目录逐步推导出到指定的文件/文件夹。
7.Pathlib.Path实用功能讲解
使用 Path 中的 cwd() 方法获取当前工作目录:
>>> Path.cwd()
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/Python39')
创建路径对象:
>>> p = Path('C:/Users/goodb/AppData/Local/Programs/Python/Python39')
使用斜杠(/)直接进行路径拼接:
>>> q = p / "FishC.txt"
>>> q
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/Python39/FishC.txt')
使用 is_dir() 方法判断路径是否为文件夹:
>>> p.is_dir()
True
>>> q.is_dir()
False
使用 is_file() 方法判断路径是否为文件:
>>> p.is_file()
False
>>> q.is_file()
True
通过 exists() 方法测试指定路径是否真实存在:
>>> p.exists()
True
>>> q.exists()
True
>>> Path("C:/404").exists()
False
使用 name 属性获取路径的最后一部分:
>>> p.name
'Python39'
>>> q.name
'FishC.txt'
stem属性用于获取文件名,suffix属性用于获取文件后缀:
>>> q.stem
'FishC'
>>> q.suffix
'.txt'
parent 属性用于获取其父目录:
>>> p.parent
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python')
>>> q.parent
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/Python39')
添加一个复数python 建立文件夹,parents,并得到一个不可变的逻辑祖先路径序列:
>>> p.parents
<WindowsPath.parents>
>>> ps = p.parents
>>> for each in ps:
... print(each)
...
C:\Users\goodb\AppData\Local\Programs\Python
C:\Users\goodb\AppData\Local\Programs
C:\Users\goodb\AppData\Local
C:\Users\goodb\AppData
C:\Users\goodb
C:\Users
C:\
还支持索引:
>>> ps[0]
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python')
>>> ps[1]
WindowsPath('C:/Users/goodb/AppData/Local/Programs')
>>> ps[2]
WindowsPath('C:/Users/goodb/AppData/Local')
parts 属性将路径的各个组件拆分为元组:
>>> p.parts
('C:\\', 'Users', 'goodb', 'AppData', 'Local', 'Programs', 'Python', 'Python39')
>>> q.parts
('C:\\', 'Users', 'goodb', 'AppData', 'Local', 'Programs', 'Python', 'Python39', 'FishC.txt')
最后,还可以查询文件或文件夹的状态信息:
>>> p.stat()
os.stat_result(st_mode=16895, st_ino=281474976983758, st_dev=1289007019, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1648462096, st_mtime=1648205377, st_ctime=1605695407)
>>> q.stat()
os.stat_result(st_mode=33206, st_ino=4503599627467517, st_dev=1289007019, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1648206152, st_mtime=1648206152, st_ctime=1648205377)
比如这个st_size就是文件或文件夹的大小信息:
>>> p.stat().st_size
4096
>>> q.stat().st_size
0
可以使用 resolve() 方法将相对路径转换为绝对路径:
>>> Path('./doc').resolve()
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/Python39/Doc')
>>> Path('../FishC').resolve()
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/FishC')
最后通过iterdir()获取当前路径下的所有子文件和子文件夹:
>>> p.iterdir()
<generator object Path.iterdir at 0x0000012D57CBE660>
它生成一个迭代器对象,因此可以将其放在 for 语句中以提取数据:
>>> for each in p.iterdir():
... print(each.name)
...
DLLs
Doc
FishC
FishC.txt
include
Lib
libs
LICENSE.txt
NEWS.txt
python.exe
python3.dll
python39.dll
pythonw.exe
Scripts
tcl
Tools
vcruntime140.dll
vcruntime140_1.dll
如果我们想把当前路径下的所有文件整理成一个列表,可以这样做(注意是文件,不是文件夹,所以需要加条件过滤器):
>>> [x for x in p.iterdir() if x.is_file()]
[WindowsPath('FishC.txt'), WindowsPath('LICENSE.txt'), WindowsPath('NEWS.txt'), WindowsPath('python.exe'), WindowsPath('python3.dll'), WindowsPath('python39.dll'), WindowsPath('pythonw.exe'), WindowsPath('vcruntime140.dll'), WindowsPath('vcruntime140_1.dll')]
以上是比较常用的与路径查询相关的操作。
然后也支持修改路径。 例如,我们可以使用 mkdir() 方法来创建一个文件夹:
>>> n = p / "FishC"
>>> n.mkdir()
>>>
注意,如果要创建的文件夹已经存在,会报错:
>>> n.mkdir()
Traceback (most recent call last):
File "" , line 1, in <module>
n.mkdir()
File "C:\Users\goodb\AppData\Local\Programs\Python\Python39\lib\pathlib.py", line 1323, in mkdir
self._accessor.mkdir(self, mode)
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'C:\\Users\\goodb\\AppData\\Local\\Programs\\Python\\Python39\\FishC'
也可以避免这个错误信息,我们可以将其exist_ok参数的值设置为True:
>>> n.mkdir(exist_ok=True)
>>>
另外需要注意的是,如果路径中有多个不存在的父目录,也会出现错误,比如这样:
>>> n = p / "FishC/A/B/C"
>>> n.mkdir(exist_ok=True)
Traceback (most recent call last):
File "" , line 1, in <module>
n.mkdir(exist_ok=True)
File "C:\Users\goodb\AppData\Local\Programs\Python\Python39\lib\pathlib.py", line 1323, in mkdir
self._accessor.mkdir(self, mode)
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'C:\\Users\\goodb\\AppData\\Local\\Programs\\Python\\Python39\\FishC\\A\\B\\C'
它还定义了一个参数来处理这种情况,只需将parents参数设置为True即可:
>>> n.mkdir(parents=True, exist_ok=True)
>>>
其实Path里面封装了一个open()方法。 除了不传入路径外,其他参数与open()函数完全相同:
>>> n = n / 'FishC.txt'
>>> n
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/Python39/FishC/A/B/C/FishC.txt')
>>> f = n.open('w')
>>> f.write("I love FishC.")
13
>>> f.close()
您可以使用 rename() 方法更改文件或文件夹的名称:
>>> n.rename("NewFishC.txt")
WindowsPath('NewFishC.txt')
然后使用 replace() 方法替换文件或文件夹:
>>> m = Path("NewFishC.txt")
>>> n
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/Python39/FishC/A/B/C/FishC.txt')
>>> m.replace(n)
WindowsPath('C:/Users/goodb/AppData/Local/Programs/Python/Python39/FishC/A/B/C/FishC.txt')
还有删除操作,rmdir()和unlink()方法,前者用于删除文件夹,后者用于删除文件:
>>> n.parent.rmdir()
Traceback (most recent call last):
File "" , line 1, in <module>
n.parent.rmdir()
File "C:\Users\goodb\AppData\Local\Programs\Python\Python39\lib\pathlib.py", line 1363, in rmdir
self._accessor.rmdir(self)
OSError: [WinError 145] 目录不是空的。: 'C:\\Users\\goodb\\AppData\\Local\\Programs\\Python\\Python39\\FishC\\A\\B\\C'
可以看到,如果不是空文件夹,是无法删除的。 我们需要先删除里面的文件:
>>> n.unlink()
>>>
现在删除文件夹就OK了:
>>> n.parent.rmdir()
>>>
最后通过glob()方法实现了强大的查找:
>>> p = Path('.')
>>> list(p.glob("*.txt"))
[WindowsPath('FishC.txt'), WindowsPath('LICENSE.txt'), WindowsPath('NEWS.txt')]
这样会找到当前目录下所有后缀为.txt的文件。 如果要查找当前目录下目录下所有后缀为.py的文件,可以这样写:
>>> p = Path('.')
>>> list(p.glob("*.txt"))
[WindowsPath('FishC.txt'), WindowsPath('LICENSE.txt'), WindowsPath('NEWS.txt')]
这样会找到当前目录下所有后缀为.txt的文件。 如果要查找当前目录下目录下所有后缀为.py的文件,可以这样写:
>>> list(p.glob('*/*.py'))
[WindowsPath('Lib/abc.py'), WindowsPath('Lib/aifc.py'), WindowsPath('Lib/antigravity.py'), ...]
那么,如果要进行向下递归查找,即查找当前目录和该目录下的所有子目录,可以用两个星号(**)来表示:
>>> list(p.glob('**/*.py'))
[WindowsPath('Lib/abc.py'), WindowsPath('Lib/aifc.py'), WindowsPath('Lib/antigravity.py'), ...]
8.with语句和上下文管理器
上下文管理器提供了一种更优雅的方式来实现文件操作。
我们来看看传统的文件操作实现:
>>> f = open("FishC.txt", "w")
>>> f.write("I love FishC.")
13
>>> f.close()
总结起来无非就是三招:打开文件->操作文件->关闭文件
那么使用with context manager方案,应该如何实现呢?
>>> with open("FishC.txt", "w") as f:
... f.write("I love FishC.")
...
13
两者是等价的。 一般来说,对于文件操作的三轴,上面是打开文件,下面是关闭文件。 这就是上下文管理器所做的。
使用上下文管理器,最大的好处是可以保证资源的释放(本例中是文件的正常关闭)。
9.泡菜
pickle 模块支持你序列化 Python 代码,解决了 Python 对象永久存储的问题。
说白了,就是把我们的源代码转换成0101001的二进制组合。
掌握pickle,只需要学会两个函数的用法:一个是dump(),一个是load()。
使用dump()函数将数据写入文件(要求文件后缀为.pkl):
import pickle
x, y, z = 1, 2, 3
s = "FishC"
l = ["小甲鱼", 520, 3.14]
d = {"one":1, "two":2}
with open("data.pkl", "wb") as f:
pickle.dump(x, f)
pickle.dump(y, f)
pickle.dump(z, f)
pickle.dump(s, f)
pickle.dump(l, f)
pickle.dump(d, f)
使用 load() 函数从 pickle 文件中读取数据:
import pickle
with open("data.pkl", "rb") as f:
x = pickle.load(f)
y = pickle.load(f)
z = pickle.load(f)
s = pickle.load(f)
l = pickle.load(f)
d = pickle.load(f)
print(x, y, z, s, l, d, sep="\n")
如果觉得重复写很多dump()和load()太麻烦,可以将多个对象打包成元组,然后序列化:
...
pickle.dump((x, y, z, s, l, d), f)
...
x, y, z, s, l, d = pickle.load(f)
...