当前位置: 主页 > Python语言

python 建立文件夹-python建立包

发布时间:2023-02-10 07:28   浏览次数:次   作者:佚名

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

python 建立文件夹_python建立包_eclipse建立xml文件

使用 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')

python 建立文件夹_eclipse建立xml文件_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

eclipse建立xml文件_python建立包_python 建立文件夹

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()

eclipse建立xml文件_python建立包_python 建立文件夹

您可以使用 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")

python 建立文件夹_python建立包_eclipse建立xml文件

>>> 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)
...

在这里插入图片描述