Python/文件
< 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>
close()
函數用於關閉一個打開的文件。
一次讀一行:
for line in open("testit.txt", "r"):
print(line)
readlines()
函數將返回文件的所有行,作為字符串組成的列表。每個字符串以換行符結尾。
readline()
函數讀取當前行,作為字符串返回。字符串以換行符結尾。
寫文件時,需要在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,參見Context Managers。
外部連結:
- 7.5. The with statement, python.org
- PEP 343 -- The "with" Statement, python.org
對文件的相關測試
編輯確定路徑是否存在:
import os
os.path.exists('<path string>')
對於Microsoft Windows™,可寫為:
import os
os.path.exists('C:\\windows\\example\\path')
或寫成"raw"字符串(r
):
import os
os.path.exists(r'C:\windows\example\path')
os.path
還包括一些有用函數:
>>> 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'
文件常見操作
編輯copy或move文件,使用庫shutil
import shutil
shutil.move("originallocation.txt","newlocation.txt")
shutil.copy("original.txt","copy.txt")
對一個目錄的遞歸複製用copytree()
,對一個目錄的遞歸move用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 currect 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
glob通配符:
通配符 | 功能 |
---|---|
* | 匹配0或多個字符 |
** | 匹配所有文件、目錄、子目錄和子目錄里的文件(3.5版本新增) |
? | 匹配1個字符,與正則表達式里的?不同 |
[exp] | 匹配指定範圍內的字符,如:[1-9]匹配1至9範圍內的字符 |
[!exp] | 匹配不在指定範圍內的字符 |
目錄的內容可以用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
得到一個目錄下的所有.txt,包括子目錄,使用list comprehension:
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 — Miscellaneous operating system interfaces in Python documentation
- glob — Unix style pathname pattern expansion in Python documentation
- shutil — High-level file operations in Python documentation
- Brief Tour of the Standard Library in The Python Tutorial