python print(len(pi_string))_Python基础之文件

一、摘要

本片博文将介绍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自会在合适的时候自动将其关闭

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

第二个例子:直接将带有路径的文件名传给了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 infile_object:print(line)

执行结果如下:

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

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

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

执行结果为:

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

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

使用关键字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 inlines:print(line.rstrip())

执行结果为:

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

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

使用文件的内容:

filename = 'pi_digits.txt'with open(filename) as file_object:

lines=file_object.readlines()

pi_string= ''

for line inlines:

pi_string+=line.rstrip()print(pi_string)print(len(pi_string))

执行结果为:

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

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

filename = 'pi_30_digits.txt'with open(filename) as file_object:

lines=file_object.readlines()

pi_string= ''

for line inlines:

pi_string+=line.strip()print(pi_string)print(len(pi_string))

执行结果为:

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

注意:读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int() 将其转换为整数,或使用函数float() 将其转换为浮点数。

关于:可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。

再看一个例子:

filename = 'pi_million_digits.txt'with open(filename) as file_object:

lines=file_object.readlines()

pi_string= ''

for line inlines:

pi_string+=line.rstrip()

birthday= input("Enter your birthday, in the form mmddyy:")if birthday inpi_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")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值