Python 编程/文件
读取整个文件
inputFileText = open("testit.txt", "r").read()
print(inputFileText)
在这种情况下,“r”参数表示文件将以只读模式打开。
从文件中读取一定数量的字节
inputFileText = open("testit.txt", "r").read(123)
print(inputFileText)
打开文件时,从文件开头开始读取。如果想要对文件进行更随机的访问,可以使用 seek()
更改文件中的当前位置,并使用 tell()
获取文件中的当前位置。以下示例对此进行了说明
>>> f=open("/proc/cpuinfo","r")
>>> f.tell()
0L
>>> f.read(10)
'processor\t'
>>> f.read(10)
': 0\nvendor'
>>> f.tell()
20L
>>> f.seek(10)
>>> f.tell()
10L
>>> f.read(10)
': 0\nvendor'
>>> f.close()
>>> f
<closed file '/proc/cpuinfo', mode 'r' at 0xb7d79770>
这里,一个文件被打开,两次读取十个字节,tell()
显示当前偏移量位于位置 20,现在 seek()
被用来回到位置 10(第二次读取开始的位置),十个字节被再次读取并打印。当不再需要对文件进行操作时,使用 close()
函数关闭我们打开的文件。
一次读取一行
for line in open("testit.txt", "r"):
print(line)
在这种情况下,readlines()
将返回一个数组,该数组包含文件中的各个行作为数组条目。可以使用 readline()
函数读取单行,该函数将当前行作为字符串返回。此示例将在文件的各个行之间输出一个额外的换行符,这是因为从文件中读取了一个换行符,而 print 引入了另一个换行符。
写入文件需要 open()
的第二个参数为“w”,这将覆盖文件已存在时打开文件时文件的现有内容
outputFileText = "Here's some text to save in a file"
open("testit.txt", "w").write(outputFileText)
追加到文件需要 open()
的第二个参数为“a”(来自追加)
outputFileText = "Here's some text to add to the existing file."
open("testit.txt", "a").write(outputFileText)
请注意,这不会在现有文件内容和要添加的字符串之间添加换行符。
从 Python 2.5 开始,可以使用 with 关键字来确保文件句柄尽快被释放,并使其异常安全
with open("input.txt") as file1:
data = file1.read()
# process the data
或者一次一行
with open("input.txt") as file1:
for line in file1:
print(line)
与 with 关键字相关的是 上下文管理器 章节。
链接
- 7.5. with 语句,python.org
- PEP 343 -- with 语句,python.org
确定路径是否存在
import os
os.path.exists('<path string>')
在 Microsoft Windows™ 等系统上工作时,目录分隔符将与路径字符串发生冲突。为了解决这个问题,请执行以下操作
import os
os.path.exists('C:\\windows\\example\\path')
但是,更好的方法是使用“原始”或 r
import os
os.path.exists(r'C:\windows\example\path')
但 os.path
中有一些其他方便的函数,其中 os.path.exists()
仅确认路径是否存在,而其他函数可以让你知道路径是文件、目录、挂载点还是符号链接。甚至还有一个函数 os.path.realpath()
可以显示符号链接的真实目标
>>> import os
>>> os.path.isfile("/")
False
>>> os.path.isfile("/proc/cpuinfo")
True
>>> os.path.isdir("/")
True
>>> os.path.isdir("/proc/cpuinfo")
False
>>> os.path.ismount("/")
True
>>> os.path.islink("/")
False
>>> os.path.islink("/vmlinuz")
True
>>> os.path.realpath("/vmlinuz")
'/boot/vmlinuz-2.6.24-21-generic'
要复制或移动文件,请使用 shutil 库。
import shutil
shutil.move("originallocation.txt","newlocation.txt")
shutil.copy("original.txt","copy.txt")
要执行递归复制,可以使用 copytree()
,要执行递归删除,可以使用 rmtree()
import shutil
shutil.copytree("dir1","dir2")
shutil.rmtree("dir1")
要删除单个文件,os 模块中存在 remove()
函数
import os
os.remove("file.txt")
可以使用 glob 查找文件
glob.glob('*.txt') # Finds files in the current directory ending in dot txt
glob.glob('*\\*.txt') # Finds files in any of the direct subdirectories
# of the currect directory ending in dot txt
glob.glob('C:\\Windows\\*.exe')
for fileName in glob.glob('C:\\Windows\\*.exe'):
print(fileName)
glob.glob('C:\\Windows\\**.exe', recursive=True) # Py 3.5: ** allows recursive nesting
可以使用 listdir 列出目录的内容
filesAndDirectories=os.listdir('.')
for item in filesAndDirectories:
if os.path.isfile(item) and item.endswith('.txt'):
print("Text file: " + item)
if os.path.isdir(item):
print("Directory: " + item)
获取目录中所有项目的列表,包括嵌套的项目
for root, directories, files in os.walk('/user/Joe Hoe'):
print("Root: " + root) # e.g. /user/Joe Hoe/Docs
for dir1 in directories:
print("Dir.: " + dir1) # e.g. Fin
print("Dir. 2: " + os.path.join(root, dir1)) # e.g. /user/Joe Hoe/Docs/Fin
for file1 in files:
print("File: " + file1) # e.g. MyFile.txt
print("File 2: " + os.path.join(root, file1))# e.g. /user/Joe Hoe/Docs/MyFile.txt
上面,root 采用 /user/Joe Hoe 中每个目录的值,包括 /user/Joe Hoe 本身,而目录和文件仅是每个 root 中直接存在的那些。
获取目录中所有以 .txt 结尾的文件列表,包括嵌套的项目,使用列表推导
files = [os.path.join(r, f) for r, d, fs in os.walk(".") for f in fs
if f.endswith(".txt")]
# As iterator
files = (os.path.join(r, f) for r, d, fs in os.walk(".") for f in fs
if f.endswith(".txt"))
链接
- glob,python.org
- glob,Py 3,python.org
- os.listdir,python.org
- os.walk,python.org
- os.path.join,python.org
获取当前工作目录
os.getcwd()
更改当前工作目录
os.chdir('C:\\')
- os — 杂项操作系统接口 在 Python 文档中
- glob — Unix 风格路径名模式扩展 在 Python 文档中
- shutil — 高级文件操作 在 Python 文档中
- 标准库简要浏览 在 Python 教程中