文本文件的读写,包括创建文本并写入数据、读取文本文件和向文本文件追加数据等内容。[大谦Excel,dqexcel点com]
创建文本文件并写入数据
本小节介绍创建新的文本文件或打开已经存在的文本文件并写入数据的操作。
【Excel VBA】
Excel VBA中使用Open语句打开指定文本文件并写入数据。该语句的语法格式为:
Open pathname For Output As filenumber [Len = buffersize]
打开文件以后,用Print语句写入数据。打开一个文件以后,在为其它类型的操作重新打开它之前必须先使用 Close 语句关闭它。
Sub SaveToFile()
Dim intFileNum As Integer
Dim strFile As String
Dim strText As String
strFile = "D:\test.txt"
strText = "谁知盘中餐" & vbCrLf & "粒粒皆辛苦"
intFileNum = FreeFile() '找到空闲的文件号
If strFile <> "" Then '如果指定了非空的文件名
'打开该文件,准备写入内容
Open strFile For Output As #intFileNum
'写入文本框中的内容
Print #1, strText
End If
'关闭文件号
Close #intFileNum
End Sub
运行过程,打开D盘下的test.txt文件,效果如图3-1所示。
图3-1 创建文本文件并写入数据
【Python】
Python中可以使用open函数进行文件的读写。该函数按指定模式打开文件,并返回一个file对象,语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, \
newline=None, closefd=True, opener=None)
其中各参数的意义为:
file: 必需参数,指定文件路径和名称。
mode: 可选参数,指定文件打开模式,包括读、写、追加等各种模式。
buffering: 可选参数,设置缓冲(不影响结果)。
encoding: 可选参数,设置编码方式,一般使用utf8。
errors: 可选参数,指定编码和解码错误时怎么处理,适用于文本模式。
newline: 可选参数,指定文本模式下,控制一行结束的字符。
closefd: 可选参数,指定传入的file参数类型。
opener: 可选参数,设置自定义文件打开方式,默认时为None。
注意,使用open函数打开文件进行操作完毕后,一定要保证关闭文件对象。关闭文件对象使用close函数。
使用open函数打开文件后会返回一个file对象,利用该对象的方法可以进行文件内容读取、写入、截取和文件关闭等一系列操作,如表3-1中所示。
表3-1 file对象的方法
| 方 法 | 说 明 |
|---|---|
| close() | 关闭文件 |
| flush() | 刷新文件的内部缓存,把内部缓存中的数据直接写入文件 |
| fileno() | 返回文件描述符,整型 |
| isatty() | 文件连接到某个终端设备时返回True,否则返回False |
| next() | 返回文件下一行 |
| read([size]) | 从文件读取指定数目的字节,如果不指定大小或指定为负则读取所有文本 |
| readline([size]) | 读取行,包括换行符,以列表的形式返回 |
| readlines([sizeint]) | 读取所有行。如果设置sizeint参数,读取指定长度的字节,并且这些字节按行分割 |
| seek(offset[, whence]) | 设置文件当前位置。offset参数指定文件相对于某个位置偏移的字节数,whence参数指定相对于哪个位置:0-从文件头开始,1-从文件当前位置开始,2-从文件尾开始 |
| tell() | 返回文件当前位置 |
| truncate([size]) | 截取指定数目的字节,size指定数目 |
| write(str) | 将字符串写入文件,返回值为写入字符串的长度 |
| writelines(sequence) | 向文件写入字符串列表,列表中每个元素占一行 |
使用open函数打开文件时,如果指定mode参数的值为表3-2中的值,如果文件不存在,则会创建新文件。
表3-2 文本文件写入时mode参数的设置
| 模式 | 说 明 |
|---|---|
| w | 打开一个文件只用于写入,如果该文件已存在,打开文件时原有内容会被删除,如果该文件不存在,则创建新文件 |
| w+ | 打开一个文件用于读写,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除,如果该文件不存在,创建新文件 |
例如,下面创建一个文本文件"test.txt",放在D盘下。
>>> f= open("D:\\test.txt","w")
open函数返回一个file对象,使用该对象的write方法往文件中写入数据。
>>> f.write("谁知盘中餐\n粒粒皆辛苦")
11
返回值11表示文件中字节的长度。
现在打开D盘下的test.txt文件,会发现什么也没有。使用file对象的close方法关闭文件对象。
>>> f.close()
现在打开该文件,发现刚刚写入的字符串显示出来了,如图3-1所示。
下面使用with语句打开文本文件后写入数据。使用这种方法的好处是执行完后会主动关闭文件,不需要用file对象的close方法进行关闭。
>>> with open("D:\\test.txt","w") as f:
f.write("大谦Excel\ndqexcel")
打开文件,发现文件原来的内容被删除,重新写入了新字符串。
使用file对象的writelines方法可以用列表结合换行符一次写入多行数据。
>>> f= open("D:\\test.txt","w")
>>> f.writelines(["大谦Excel\n","dqexcel"])
>>> f.close()
打开文件,列表中的两个元素数据已经分两行写入。
下面打开文本文件后使用循环连续写入数据。其中," \r", "\n"表示回车和换行。
>>> f= open("D:\\test.txt","w")
>>> for i in range(10):
f.write("Hello Python!\r\n")
>>> f.close()
打开文件,已经连续写入了10行"Hello Python!"。
读取文本文件
3.1.1小节介绍了创建或打开文本文件并写入数据的情况,这里介绍如何将数据从文本文件中读取出来。
【Excel VBA】
Excel VBA中使用Open语句读取指定文本文件中的数据。该语句的语法格式为:
Open pathname For Input As filenumber [Len = buffersize]
打开文件进行读取时,该文件必须已经存在,否则会产生一个错误。使用Input语句、Input函数或Line Input语句读取数据。在打开一个文件以后,在为其它类型的操作重新打开它之前必须先使用 Close 语句关闭它。
下面的例子用Open语句打开文本文件并读取数据。
Sub OpenFile()
Dim intFileNum As Integer
Dim LinesFromFile As String
Dim NextLine As String
Dim strFile As String
strFile = "D:\test.txt"
intFileNum = FreeFile() '找到空闲的文件号
If strFile <> "" Then '如果指定了非空的文件名
'打开该文件,准备读取内容
Open strFile For Input As #intFileNum
'读取文件中的内容
Do Until EOF(intFileNum)
Line Input #intFileNum, NextLine
LinesFromFile = LinesFromFile & NextLine & Chr(13) & Chr(10)
Loop
End If
Debug.Print LinesFromFile
'关闭文件号
Close #intFileNum
End Sub
运行过程,在立即窗口中输出文件数据。使用Input语句和Input函数的情况请参见同模块中的OpenFile2和OpenFile3两个过程。
【Python】
使用open函数打开文件时,如果指定mode参数的值为表3-3中的值,读取文件中的内容。
表3-3 文本文件读取时mode参数的设置
| 模式 | 说 明 |
|---|---|
| r | 以只读方式打开文件,为默认模式 |
| r+ | 打开一个文件用于读写 |
下面用open函数打开D盘下的test.txt文件,将mode参数的值设置为"r",只读。用file读写的read方法读取文件的内容。
>>> f= open("D:\\test.txt","r")
>>> f.read()
'大谦Excel\ndqexcel'
下面用file读写的write方法向文件中写入数据。
>>> f.write("This is a test.")
Traceback(most recent call last):
File "<pyshell#32>", line 1, in <module>
f.write("This is a test.")
io.UnsupportedOperation: not writable
>>> f.close()
可见,因为打开文件时mode参数设置为"r",只读,所以试图向文件写入数据时报错。
使用file对象的readline方法逐行读取数据。
>>> f= open("D:\\test.txt","r")
读取第1行数据:
>>> f.readline()
'Hello Python!\n'
读取第2行数据,是个空行:
>>> f.readline()
'\n'
读取第3行数据的前5个字符:
>>> f.readline(5)
'Hello'
>>> f.close()
使用file对象的readlines方法读取全部行数据。
>>> f= open("D:\\test.txt","r")
>>> f.readlines()
['Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n', 'Hello Python!\n', '\n']
>>> f.close()
向文本文件追加数据
3.1.1小节打开已有文件并写入新数据时,原有数据会被删除。本小节讨论保留原有数据,向文本文件追加数据的情况。
【Excel VBA】
Excel VBA中用Open语句打开文本文件时使用Append关键字可以实现向文件追加数据。下面打开D盘下的文本文件test.txt,保留原有内容,在末尾追加新的字符串。
Sub AppendFile()
Dim intFileNum As Integer
Dim strFile As String
Dim strText As String
strFile = "D:\test.txt"
strText = "锄禾"
intFileNum = FreeFile() '找到空闲的文件号
If strFile <> "" Then '如果指定了非空的文件名
'打开该文件,在末尾添加内容
Open strFile For Append As #intFileNum
'写入文本框中的内容
Print #1, strText
End If
'关闭文件号
Close #intFileNum
End Sub
运行过程,在原有内容后面添加新数据。
【Python】
Python中使用open函数打开文件时,如果指定mode参数的值为表3-4中的值,可以在原有内容后面追加数据,即原来的数据保留,继续追加。
表3-4 文本文件追加时mode参数的设置
| 模式 | 说 明 |
|---|---|
| a | 打开一个文件用于追加,如果该文件已存在,新的内容将会被写入到已有内容之后,如果该文件不存在,则创建新文件 |
| a+ | 打开一个文件用于读写。如果该文件已存在,新的内容将会被写入到已有内容之后,如果该文件不存在,则创建新文件 |
下面打开D盘下的test.txt文件,设置mode参数的值为"a"。
>>> f= open("D:\\test.txt","a")
添加新行:
>>> f.write("锄禾")
>>> f.close()
打开该文本文件,现在在原有内容的后面添加了新行数据,原有内容仍然保留。[大谦Excel,dqexcel点com]