Python基础之“文件”

版权声明:本文为博主原创,感谢支持与鼓励 转载请注明出处 https://blog.csdn.net/dawei_yang000000/article/details/86313962

一、摘要

本片博文将介绍python处理文件的诸多方法

二、文件实操

文本文件可存储的数据量多得难以置信:天气数据、交通数据、社会经济数据、文学作品等。每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

读取整个文件:

创建了一个python文件file_reader.py,文件里编写如下代码

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)
>>> filepath = "C:/Users/davieyang/Desktop/11111.txt"
>>> file_object = open(filepath)
>>> file_content = file_object.read()
>>> print(file_content)
1111111111
2222222222
3333333333
4444444444
5555555555
>>> file_object.close()

函数open()接受一个参数:要打开的文件的名称或者是带路径的文件名,例子中能够看到两种情况的使用。

第一个例子:要打开的文件名是:pi_digits.txt,执行python文件的时候,被打开的文件pi_digits.txt必须跟python文件file_reader.py在同一个路径下,否则将找不到并报异常:FileNotFoundError: [Errno 2] No such file or directory: ‘pi_digits.txt’,如果想避免这种情况,可以像第二个例子一样连路径一起传给open()函数,此例子Python在file_reader.py所在的目录中查找pi_digits.txt。函数open() 返回一个表示文件的对象。在这里,open(‘pi_digits.txt’) 返回一个表示文件pi_digits.txt 的对象;Python将这个对象存储在我们将在后面使用的变量中,有了表示pi_digits.txt的文件对象后,我们使用方法read(),读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents 中。这样,通过打印contents 的值,就可将这个文本文件的全部内容显示出来
关键字with 在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open() ,但没有调用close() ;你也可以调用open() 和close() 来打开和关闭文件,但这样做时,如果程序存在bug,导致close() 语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close() ,你会发现需要使用文件时它已关闭 (无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭
在这里插入图片描述
第二个例子:直接将带有路径的文件名传给了open(), 最后还要将打开的对象使用close()函数关闭

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents.rstrip())

read() 函数会在读到文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print 语句中使用rstrip() :

实际上除了给open()函数文件名、带绝对路径的文件名之外,还可以给他带相对路径的文件名,相对路径在不同操作系统中要特别注意,在Linux和OS X中,你可以这样编写代码:

with open('text_files/filename.txt') as file_object:

在Windows系统中,在文件路径中使用反斜杠(\ )而不是斜杠(/ ):

with open('text_files\filename.txt') as file_object:

如果程序报这样的错误:SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape, 那八成是斜杠反了

逐行读取:

读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。

filename = 'pi_digits.txt'
    with open(filename) as file_object:
    for line in file_object:
      print(line)

执行结果如下:
在这里插入图片描述
为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print 语句。要消除这些多余的空白行,可在print 语句中使用rstrip() :

filename = 'pi_digits.txt'
    with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip()) 

执行结果为:
在这里插入图片描述

创建一个包含文件各行内容的列表:

使用关键字with 时,open() 返回的文件对象只在with 代码块内可用。如果要在with 代码块外访问文件的内容,可在with 代码块内将文件的各行存储在一个列表中,并在with 代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。下面的示例在with 代码块中将文件pi_digits.txt的各行存储在一个列表中,再在with 代码块外打印它们:

file_name = "C:/Users/davieyang/Desktop/pi_digits.txt"
with open(file_name) as file_object:
    lines = file_object.readlines()
print(lines)
for line in lines:
    print(line.rstrip()) 

执行结果为:
在这里插入图片描述
readlines() 从文件中读取每一行,并将其存储在一个列表中;接下来,该列表被存储到变量lines 中;在with 代码块外,我们依然可以使用这个变量。在处,我们使用一个简单的for 循环来打印lines 中的各行。由于列表lines 的每个元素都对应于文件中的一行,因此输出与文件内容完全一致。

使用文件的内容:

filename = 'pi_digits.txt'
with open(filename) as file_object:
    lines = file_object.readlines()
pi_string = ''
for line in lines:
    pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))

执行结果为:
在这里插入图片描述
在变量pi_string 存储的字符串中,包含原来位于每行左边的空格,为删除这些空格,可使用strip() 而不是rstrip() :

filename = 'pi_30_digits.txt'
with open(filename) as file_object:
    lines = file_object.readlines()
pi_string = ''
for line in lines:
    pi_string += line.strip()
print(pi_string)
print(len(pi_string))

执行结果为:
在这里插入图片描述
注意:读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int() 将其转换为整数,或使用函数float() 将其转换为浮点数。
关于:可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。
再看一个例子:

filename = 'pi_million_digits.txt'
with open(filename) as file_object:
    lines = file_object.readlines()
pi_string = ''
for line in lines:
    pi_string += line.rstrip()
birthday = input("Enter your birthday, in the form mmddyy: ")
if birthday in pi_string:
    print("Your birthday appears in the first million digits of pi!")
else:
    print("Your birthday does not appear in the first million digits of pi.")

写入文件:

filename = 'programming.txt'
with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

调用open() 时提供了两个实参。第一个实参也是要打开的文件的名称;第二个实参(‘w’ )告诉Python,我们要以写入模式 打开这个文件。打开文件时,可指定读取模式 (‘r’ )、写入模式 (‘w’ )、附加模式 (‘a’ )或让你能够读取和写入文件的模式(‘r+’ )。如果你省略了模式实参,Python将以默认的只读模式打开文件。如果你要写入的文件不存在,函数open() 将自动创建它。然而,以写入(‘w’ )模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件,本实例中我们使用文件对象的方法write() 将一个字符串写入文件
注意:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。
另外:函数write() 不会在你写入的文本末尾添加换行符,因此如果你想写入多行时要指定换行符

filename = 'programming.txt'
with open(filename, 'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

附加到文件:
如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式 打开文件。你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。

如下实例打开文件时指定了实参’a’ ,以便将内容附加到文件末尾,而不是覆盖文件原来的内容

filename = 'programming.txt'
with open(filename, 'a') as file_object:
    file_object.write("I also love finding meaning in large datasets.\n")
    file_object.write("I love creating apps that can run in a browser.\n")

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/86313962