从文件输入
也可以从文件中读取输入。可以使用内置函数 open
打开文件。使用 with <command> as <name>
语法(称为上下文管理器)使得使用 open
并获得文件的句柄非常容易:
with open('somefile.txt', 'r') as fileobj:
# write code here using fileobj
这可确保在代码执行离开块时文件自动关闭。
文件可以以不同的模式打开。在上面的示例中,文件以只读方式打开。要打开现有文件以供阅读,请使用 r
。如果要将该文件作为字节读取,请使用 rb
。要将数据附加到现有文件,请使用 a
。使用 w
创建文件或覆盖任何同名的现有文件。你可以使用 r+
打开文件进行读写。open()
的第一个参数是文件名,第二个是模式。如果模式为空白,则默认为 r
。
# let's create an example file:
with open('shoppinglist.txt', 'w') as fileobj:
fileobj.write('tomato\npasta\ngarlic')
with open('shoppinglist.txt', 'r') as fileobj:
# this method makes a list where each line
# of the file is an element in the list
lines = fileobj.readlines()
print(lines)
# ['tomato\n', 'pasta\n', 'garlic']
with open('shoppinglist.txt', 'r') as fileobj:
# here we read the whole content into one string:
content = fileobj.read()
# get a list of lines, just like int the previous example:
lines = content.split('\n')
print(lines)
# ['tomato', 'pasta', 'garlic']
如果文件的大小很小,则可以安全地将整个文件内容读入内存。如果文件非常大,通常最好逐行或按块读取,并在同一循环中处理输入。要做到这一点:
with open('shoppinglist.txt', 'r') as fileobj:
# this method reads line by line:
lines = []
for line in fileobj:
lines.append(line.strip())
读取文件时,请注意特定于操作系统的换行符。虽然 for line in fileobj
会自动将它们剥离,但在读取的行上调用 strip()
总是安全的,如上图所示。
打开的文件(上例中的 fileobj
)始终指向文件中的特定位置。首次打开它们时,文件句柄指向文件的最开头,即 0
的位置。文件句柄可以用 tell
显示它的当前位置:
fileobj = open('shoppinglist.txt', 'r')
pos = fileobj.tell()
print('We are at %u.' % pos) # We are at 0.
在读取所有内容后,文件处理程序的位置将指向文件的末尾:
content = fileobj.read()
end = fileobj.tell()
print('This file was %u characters long.' % end)
# This file was 22 characters long.
fileobj.close()
文件处理程序位置可以设置为所需的任何位置:
fileobj = open('shoppinglist.txt', 'r')
fileobj.seek(7)
pos = fileobj.tell()
print('We are at character #%u.' % pos)
你还可以在给定呼叫期间从文件内容中读取任何长度。为此,传递 read()
的参数。当没有参数调用 read()
时,它将一直读到文件结尾。如果传递参数,它将读取该字节数或字符数,具体取决于模式(分别为 rb
和 r
):
# reads the next 4 characters
# starting at the current position
next4 = fileobj.read(4)
# what we got?
print(next4) # 'cucu'
# where we are now?
pos = fileobj.tell()
print('We are at %u.' % pos) # We are at 11, as we was at 7, and read 4 chars.
fileobj.close()
要演示字符和字节之间的区别:
with open('shoppinglist.txt', 'r') as fileobj:
print(type(fileobj.read())) # <class 'str'>
with open('shoppinglist.txt', 'rb') as fileobj:
print(type(fileobj.read())) # <class 'bytes'>