级别: 中级
Robert Brunner
(rb@ncsa.uiuc.edu
), NCSA 研究科学家,助理天文学教授, 伊利诺斯 Urbana-Champaign 大学
2006 年 3 月 06 日
在这篇文章中,将学习如何处理文件。首先,回顾一种使用 Python 输出数据的简单方式,然后学习文件对象,Python 程序用它从文件读取数据和把数据写入文件。将演示打开文件的不同模式,最后将显示如何读取和写入二进制文件。
<!----><!---->
<!---->
读取、写入和 Python
在 “探索 Python
” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如 tuple
、string
和 list
。其他文章讨论了 Python 语言的条件和循环特性,以及它们如何与容器数据类型进行协作来简化编程任务。编写程序的最后一个基本步骤就是从文件读取数据和把数据写入文件。阅读完这篇文章之后,可以在自己的 to-do 列表中加上检验这个技能学习效果的任务。
简单输出
贯穿整个系列,一直用 print
语句写入(输出)数据,它默认把表达式作为 string
写到屏幕上(或控制台窗口上)。清单 1 演示了这一点。清单 1 重复了第一个 Python 程序 “Hello, World!”,但是做了一些小的调整。
清单 1. 简单输出
>>> print "Hello World!"
Hello World!
>>> print "The total value is = $", 40.0*45.50
The total value is = $ 1820.0
>>> print "The total value = $%6.2f" % (40.0*45.50)
The total value = $1820.00
>>> myfile = file("testit.txt", 'w')
>>> print >> myfile, "Hello World!"
>>> print >> myfile, "The total value = $%6.2f" % (40.0*45.50)
>>> myfile.close()
|
正如这个示例演示的,用 print
语句写入数据很容易。首先,示例输出一个简单的 string
。然后创建并输出复合的 string
,这个字符串是用 string
格式化技术创建的。
但是,在这之后,事情发生了变化,与代码以前的版本不同。接下来的一行创建 file
对象,传递进名称 "testit.txt"
和 'w'
字符(写入文件)。然后使用修改过的 print
语句 —— 两个大于号后边跟着容纳 file
对象的变量 —— 写入相同的 string
。但是这一次,数据不是在屏幕上显示。很自然的问题是:数据去哪儿了?而且,这个 file
对象是什么?
第一个问题很容易回答。请查找 testit.txt 文件,并像下面那样显示它的内容。
% more testit.txt
Hello World!
The total value = $1820.00
|
可以看到,数据被准确地写入文件,就像以前写到屏幕上一样。
现在,请注意清单 1 中的最后一行,它调用 file
对象的 close
方法。在 Python 程序中这很重要,因为在默认情况下,文件输入和输出是缓冲的
;在调用 print
语句时,数据实际未被写入;相反,数据是成批写入的。让 Python 把数据写入文件的最简单方式就是显式地调用 close
方法。
文件对象
file
是与计算机上的文件进行交互的基本机制。可以用 file
对象读取数据、写入数据或把数据添加到文件,以及处理二进制或文本数据。
学习 file
对象的最简单方法就是阅读帮助,如清单 2 所示。
清单 2. 得到 file 对象的帮助
>>> help(file)
Help on class file in module __builtin__:
class file(object)
| file(name[, mode[, buffering]]) -> file object
|
| Open a file. The mode can be 'r', 'w' or 'a' for reading (default),
| writing or appending. The file will be created if it doesn't exist
| when opened for writing or appending; it will be truncated when
| opened for writing. Add a 'b' to the mode for binary files.
| Add a '+' to the mode to allow simultaneous reading and writing.
| If the buffering argument is given, 0 means unbuffered, 1 means line
| buffered, and larger numbers specify the buffer size.
| Add a 'U' to mode to open the file for input with universal newline
| support. Any line ending in the input file will be seen as a '\n'
| in Python. Also, a file so opened gains the attribute 'newlines';
| the value for this attribute is one of None (no newline read yet),
| '\r', '\n', '\r\n' or a tuple containing all the newline types seen.
|
| 'U' cannot be combined with 'w' or '+' mode.
|
| Note: open() is an alias for file().
|
| Methods defined here:
...
|
正如帮助工具指出的,使用 file
对象很简单。用 file
构造函数或 open
方法创建 file
对象,open 是 file
构造函数的别名。第二个参数是可选的,它指定文件的使用方式:
'r'
(默认值)表示从文件读取数据。
'w'
表示要向文件写入数据,并截断以前的内容。
'a'
表示要向文件写入数据,但是添加到当前内容尾部。
'r+'
表示对文件进行读写操作(删除以前的所有数据)。
'r+a'
表示对文件进行读写操作(添加到当前内容尾部)。
'b'
表示要读写二进制数据。
这篇文章的第一个代码清单向文件写入数据。现在,清单 3 显示如何把这个数据读入 Python 程序,并解析文件的内容。
清单 3. 从文件读取数据
>>> myfile = open("testit.txt")
>>> myfile.read()
'Hello World!\nThe total value = $1820.00\n'
>>> str = myfile.read()
>>> print str
>>> myfile.seek(0)
>>> str = myfile.read()
>>> print str
Hello World!
The total value = $1820.00
>>> str.split()
['Hello', 'World!', 'The', 'total', 'value', '=', '$1820.00']
>>> str.split('\n')
['Hello World!', 'The total value = $1820.00', '']
>>> for line in str.split('\n'):
... print line
...
Hello World!
The total value = $1820.00
>>> myfile.close()
|
要读取数据,首先要创建合适的 file
对象 —— 在这个示例中,文件对象打开 testit.txt 文件,并用 read
方法读取内容。这个方法把整个文件读入一个 string
,然后在程序中把这个字符串输出到控制台。在对 read
方法的第二个调用中,试图把值分配给 str
变量,结果返回一个空的 string
。这是因为第一个 read 操作读入了整个文件。当试图再次读取内容时,已经到了文件末尾,所以什么也读不到。
这个问题的解决方案也很简单:让 file
对象返回文件的开头。回到开头要通过 seek
方法进行,它接受一个参数,表示要从文件中的什么位置开始读取或写入(例如,0 代表文件开头)。seek
方法支持更复杂的操作,但是可能会有危险。对于目前来说,我们还坚持采用简单方式。
现在回到了文件的开始之处,可以把文件内容读入 string
变量并对 string
做适当地解析。请注意,在文件中,行之间用新行(或行结束)字符区分。如果试着在 string
上调用 split
方法,它会在空白字符(例如空格)处进行拆分。为了让方法根据新行字符拆分各行,必须显式地指定新行字符。然后可以拆分 string
并在 for
循环中对文件的行进行迭代。
看起来仅仅从文件中读取和处理一行内容都有许多工作要做。Python 要让简单的事情变容易,所以您可能想知道这个任务有没有快捷方式可用。如清单 4 所示,答案是 yes。
清单 4. 读取和解析行
>>> myfile = open("testit.txt")
>>> for line in myfile.readlines():
... print line
...
Hello World!
The total value = $1820.00
>>> myfile.close()
>>> for line in open("testit.txt").readlines():
... print line
...
Hello World!
The total value = $1820.00
>>> for line in open("testit.txt"):
... print line
...
Hello World!
The total value = $1820.00
|
清单 4 演示了读取和解析文本文件行的三种技术。首先,打开文件并把它分配给变量。然后调用 readlines
方法,把整个文件读入内存并把内容拆分成 string
列表。for
循环在 string
列表上进行迭代,一次输出一行。
第二个 for
循环通过使用 file
对象的隐式变量(也就是说,变量不是显式创建的),对这个过程稍做了点儿简化。打开文件和读取文件内容一次完成,生成的效果与第一个显式示例相同。最后一个示例进一步做了简化,并演示了直接在 file
对象上进行迭代的能力(请注意,这是 Python 的一个新特性,所以在您的计算机上可能无法工作)。在这个示例中,创建隐式 file
对象,然后 Python 做余下的工作,允许对文件中的全部行进行迭代。
但是,有些时候,在从文件读取数据时,可能想要更好的控制级别。在这种情况下,应当使用 readline
方法,如清单 5 所示。
清单 5. 读取数据
>>> myfile = open("testit.txt")
>>> myfile.readline()
'Hello World!\n'
>>> myfile.readline()
'The total value = $1820.00\n'
>>> myfile.readline()
''
>>> myfile.seek(0)
>>> myfile.readline()
'Hello World!\n'
>>> myfile.tell()
13L
>>> myfile.readline()
'The total value = $1820.00\n'
>>> myfile.tell()
40L
>>> myfile.readline()
''
>>> myfile.tell()
40L
>>> myfile.seek(0)
>>> myfile.read(17)
'Hello World!\nThe '
>>> myfile.seek(0)
>>> myfile.readlines(23)
['Hello World!\n', 'The total value = $1820.00\n']
>>> myfile.close()
|
这个示例演示了如何在文件中移动,一次读取一行,或者显式地用 seek
方法移动文件位置指示器。首先,用 readline
方法在文件行中移动。当到达文件末尾时,readline
方法返回一个空的 string
。在过了文件末尾之后,如果还用这种方式继续读取,并不会造成错误,只会返回空的 string
。
然后返回文件开始的地方,并读取另一行。 tell
方法显示出在文件中的当前位置(应当在第一行文本之后) —— 在这个示例中,在第 13 个字符位置。通过使用这个知识,可以向 read
或readline
方法传递一个参数,控制读取的字符数。对于 read
方法,这个参数(在这个示例中是 17)是要从文件中读取的字符数。但是 readline
方法在读入指定数量的字符后,还会继续读取,直到行尾。在这个示例中,它读取第一行和第二行文本。
写入数据
迄今为止的示例都侧重于读取数据,而不是写入数据。但是如清单 6 所示,一旦了解了使用 file
对象的基础知识,写入也很容易。
清单 6. 写入数据
>>> mydata = ['Hello World!', 'The total value = $1820.00']
>>> myfile = open('testit.txt', 'w')
>>> for line in mydata:
... myfile.write(line + '\n')
...
>>> myfile.close()
>>> myfile = open("testit.txt")
>>> myfile.read()
'Hello World!\nThe total value = $1820.00\n'
>>> myfile.close()
>>> myfile = open("testit.txt", "r+")
>>> for line in mydata:
... myfile.write(line + '\n')
...
>>> myfile.seek(0)
>>> myfile.read()
'Hello World!\nThe total value = $1820.00\n'
>>> myfile.close()
>>> myfile = open("testit.txt", "r+a")
>>> myfile.read()
'Hello World!\nThe total value = $1820.00\n'
>>> for line in mydata:
... myfile.write(line + '\n')
...
>>> myfile.seek(0)
>>> myfile.read()
'Hello World!\nThe total value = $1820.00\nHello World!\nThe total value = $1820.00\n'
>>> myfile.close()
|
要把数据写入文件,必须先创建 file
对象。但是,在这情况下,必须用 'w'
模式标记指定要写入文件。在这个示例中,把 mydata list
的内容写入文件,关闭文件,然后重新打开文件,这样就可以读取内容了。
但是,通常情况下,想要同时读取文件和写入文件,所以这个示例的下一部分用 'r+'
模式重新打开文件。因为能够写入文件,而不是添加,所以文件会被截断。首先,把 mydata list
的内容写入文件,然后把文件指针重新定位到文件开头,并读入内容。然后这个示例关闭文件,并用读取和添加模式 "r+a"
重新打开文件。正如示例代码所示,文件内容现在是两个写入操作的结果(文本是重复的)。
处理二进制数据
前面所有的示例都处理文本数据或字符数据:写入和读取字符 string
。但是,在某些情况下,例如在处理整数或压缩文件时,需要能够读取和写入二进制数据。在创建 file
对象时,通过把 'b'
添加到文件模式中,可以很容易地用 Python 处理二进制数据,如清单 7 所示。
清单 7. 处理二进制数据
>>> myfile = open("testit.txt", "wb")
>>> for c in range(50, 70):
... myfile.write(chr(c))
...
>>> myfile.close()
>>> myfile = open("testit.txt")
>>> myfile.read()
'23456789:;<=>?@ABCDE'
>>> myfile.close()
|
在这个示例中,创建一个合适的 file
对象,然后用从 50 到 69 的 ASCII 值写入二进制字符。使用 chr
方法,把 range
方法调用创建的整数转变成字符。在写完所有数据之后,关闭文件并重新打开文件进行读取,还是使用二进制模式标记。读取文件可以证明没有把整数写入文件,相反,写的是字符值。
在读取和写入二进制数据时,必须小心,因为不同的平台用不同的方式保存二进制数据。如果必须处理二进制数据,最好是使用来自 Python 库的合适对象(或者来自第三方开发人员的对象)。
读取和写入:最有趣的地方
这篇文章讨论了在 Python 程序中如何从文件读取数据和写入数据到文件中。总体来说,过程很简单:创建合适的 file
对象,然后按照需要读取和写入。但是,在使用写入模式创建 file
文件,向文件写入数据时,必须注意文件的截断。如果需要向文件中添加数据,应当在创建 file
对象时,使用添加模式。
|
相关推荐
综上所述,本教程通过示例代码和概念讲解,介绍了在Python中进行文件输入输出操作的基本知识点,包括如何使用print语句进行数据输出、如何操作文件对象进行数据写入和读取、文件操作中的缓冲机制以及如何获取帮助...
"通过IO对TXT进行读取和写入"是一个常见的任务,适用于多种编程语言,如Java、Python、C#等。在此,我们将深入探讨如何使用IO操作来读取和写入TXT文件,以及相关的重要知识点。 首先,让我们理解什么是TXT文件。TXT...
Python作为一门广泛应用于数据分析、人工智能和Web开发等领域的高级编程语言,其简洁的代码和强大的功能深受程序员喜爱。在Python编程中,输入输出语句扮演着至关重要的角色,它们允许程序与用户进行交互,接收用户...
本文将介绍如何使用Python来读取文本文件(txt格式)的内容,并将其写入到Excel文件(xls格式)中。本文的知识点包括Python的文件操作、编码处理、文件内容的读取和解析以及使用第三方库将数据写入Excel。 首先,...
理解并熟练掌握Python的输入输出功能,对于编写实用的脚本和应用程序至关重要。 一、Python输入(Input) 1. `input()`函数:这是Python中最基本的用户输入方式。它会暂停程序执行,等待用户在终端输入信息,然后...
以上代码展示了如何使用Python结合`geopandas`和`rasterio`库,根据Shp矢量数据裁剪遥感影像的基本步骤。在实际应用中,可能还需要考虑其他因素,如投影转换、坐标系兼容性、数据预处理等。此外,`Input_Path.txt`和...
在这个"Python之输出和输入共5页.pdf.zip"的压缩包中,我们可以期待了解到关于Python编程中的基本输入输出操作,这是任何编程学习的起点。接下来,我将详细讲解Python中的输出和输入功能。 **一、输出** 在Python...
Python 语言在处理文件和数据格式化方面提供了丰富的功能,使得开发者能够高效地读取、写入和操作各种数据源。文件是数据持久化的基础,它们可以存储文本、二进制数据或者其他各种类型的信息。本章主要介绍了Python...
例如,可以使用`pickle.dump()`将对象写入文件,然后通过`pickle.load()`读取。这种方法适用于存储包括列表、元组、字典等各种Python对象,甚至包括NumPy的ndarray对象。pickle模块在处理大型数据集时效率较高,但...
5. **输入输出的进阶使用**:Python的IO系统非常强大,不仅限于简单的`input()`和`print()`。可以使用`open()`函数的其他模式,如追加模式('a')、读写模式('r+')等。此外,还有更高级的文件操作,如缓冲、错误...
* 文件输入输出:读取二进制文件、写入文件 * 数据处理:数组处理、数字处理 * 函数编程:定义函数、函数调用 * 算法设计:排序算法、筛选算法 * 数据结构:数组、字典 * 其他知识点:文件处理、错误处理 * 实践经验...
总结来说,Linux下读取和写入ini文件涉及到基本的文件I/O操作、字符串解析和数据结构管理。根据具体需求,可以选择使用标准库函数,或者利用现成的编程语言库,以高效、安全的方式处理ini文件。
4. 输入输出处理:在这个程序中,我们使用 `input` 函数来获取用户输入的班级数量,并使用 `print` 函数来输出调试信息和最终结果。 5. Excel 文件处理:我们使用 openpyxl 库来读取和操作 Excel 文件,包括读取...
- **为何选择Python处理Excel**:Python提供了强大的库支持(如`pandas`、`openpyxl`等),可以高效地处理Excel数据,包括读取、写入、分析等功能。 #### 二、Python环境搭建 - **Python安装**: - **下载**:访问...
3. **数据管理**:Python可以轻松读取和写入多种地理数据格式,如Shapefile、Geodatabase、栅格数据等,便于数据的导入导出和转换。 4. **自动化工作流**:对于重复性的GIS任务,Python脚本可以实现批处理,节省...
3. **数据传输**:读取设备发送的数据,或者向设备写入命令。hidapi提供了同步和异步的读写操作,可以处理各种大小的报告。 4. **错误处理**:hidapi提供了丰富的错误处理机制,帮助开发者识别并解决与设备通信过程...
总结一下,这个项目展示了如何使用Python和`pandas`库来实现Excel文件的数据自动化处理,具体步骤包括数据读取、处理和写入。通过学习这个项目,我们可以掌握Python在办公自动化中的应用,提高处理大量表格数据的...
本讲将深入探讨Python中的输入输出操作,这对于处理金融大数据至关重要,因为数据的读取、写入和分析是数据分析过程的基础。 1. **文件I/O基础** Python提供了多种方法来处理文件输入输出,包括`open()`函数,用于...
2. `os`模块:虽然`os.system()`也可以执行系统命令,但在Python 3中,推荐使用`subprocess`模块,因为它提供了更丰富的功能和更好的错误处理。 3. `cp -a`命令的使用:解释如何在命令行中使用`cp`命令的`-a`选项,...
在实际应用中,Python-KiCAD到Boardview导出器的使用方法可能包括调用Python脚本来运行转换,将指定的`.kicad_pcb`文件作为输入,然后得到ASCII Boardview文件作为输出。用户可以根据需要对这个脚本进行定制,以满足...