跳转至内容

Python 编程/文件

来自维基教科书,开放书籍,开放世界


文件 I/O

[编辑 | 编辑源代码]

读取整个文件

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 关键字相关的是 上下文管理器 章节。

链接

测试文件

[编辑 | 编辑源代码]

确定路径是否存在

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

链接

当前目录

[编辑 | 编辑源代码]

获取当前工作目录

os.getcwd()

更改当前工作目录

os.chdir('C:\\')
[编辑 | 编辑源代码]
华夏公益教科书