当前位置: 首页 > news >正文

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自会在合适的时候自动将其关闭

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

 

转载于:https://www.cnblogs.com/davieyang/p/10246475.html

相关文章:

  • 使用vuepress搭建文档管理/博客
  • 什么是分布式系统,如何学习分布式系统
  • Dynamics CRM - 如何解决 Microsoft Dynamics CRM has encountered an error 弹窗的问题
  • python队列Queue
  • [转]让Linux进入虚拟机 Virtualenv
  • C++学习二十C++中函数重载的理解
  • vuex存储和本地存储(localstorage、sessionstorage)的区别
  • Ubuntu下postgresql安装及常见错误处理
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • IP 别名和辅助 IP 地址
  • python 使用多线程进行并发编程/互斥锁的使用
  • 树莓派Ubuntu 16.04 MATA系统 修改用户文件夹名后,提示configure it with blueman-service...
  • 基于websocket的单聊.群聊
  • Python(76)_装饰器进阶_带参数的装饰器
  • 烂泥分享的镜像下载地址
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 0基础学习移动端适配
  • Java IO学习笔记一
  • JS实现简单的MVC模式开发小游戏
  • Kibana配置logstash,报表一体化
  • Markdown 语法简单说明
  • Python十分钟制作属于你自己的个性logo
  • Redis 中的布隆过滤器
  • Redis的resp协议
  • Spring Cloud中负载均衡器概览
  • SQLServer之索引简介
  • 第十八天-企业应用架构模式-基本模式
  • 高性能JavaScript阅读简记(三)
  • 基于Android乐音识别(2)
  • 数据科学 第 3 章 11 字符串处理
  • 王永庆:技术创新改变教育未来
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 异步
  • 原生 js 实现移动端 Touch 滑动反弹
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Spring Boot 分片上传文件
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • $.ajax中的eval及dataType
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C++20) consteval立即函数
  • (js)循环条件满足时终止循环
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (TOJ2804)Even? Odd?
  • (四)Linux Shell编程——输入输出重定向
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)重识new
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .Net Winform开发笔记(一)