Python数据分析 | (4)文件和操作系统

本篇博客所有示例使用Jupyter NoteBook演示。

Python数据分析系列笔记基于:利用Python进行数据分析(第2版)  

 

目录

1.文件处理基础知识

2.文件的字节和Unicode


 

1.文件处理基础知识

之后的学习中,我们通常使用诸如pandas.read_csv之类的高级工具将磁盘上的数据文件读入Python数据结构。但是我们还是需要学习一下Python文件处理方面的基础知识。好在Python在文本和文件处理方面比较简单,这也是他流行的原因。

  • 打开文件

使用内置的open函数传入一个相对或绝对的文件路径,就可以打开一个文件以便读写。

path = 'simple.txt'    #相对路径
f = open(path)  #默认以只读模式打开 'r'
for line in f:   #像处理列表那样处理文件句柄f
    pass    

从文件中取出的行都带有完整的行结束符(EOL),通常要得到一组没有EOL的行:

path = 'simple.txt'
lines = [x.rstrip() for x in open(path)] #去掉每行的行结束符
lines #包含文件所有行的列表  每一个元素为文件的一行

如果使用open创建文件对象,一定要用close关闭,返回操作系统资源:

f.close()

用with语句可以更容易地清理打开的文件:

with open(path) as f:
    lines = [x.rstrip() for x in f]

退出with代码块,自动关闭文件。

如果使用 f = open(path,'w'),就会有一个新文件被创建在simple.txt,并覆盖掉原来的文件内容。另外有一个'x'文件模式,可以创建可写文件,但是文件路径如果存在,就无法创建。常见的所有读/写模式:

  • 读取文件

对于可读文件,常用的方法是read、seek和tell。read会从文件返回字符。字符内容由文件的编码决定(如UTF-8),如果是二进制模式打开就是原始字节:

import sys
print(sys.getdefaultencoding()) #检查默认编码

f = open(path)
print(f.read(10)) #使用read()读取前10个字符/字节
print(f.tell()) #read会将文件句柄提前 提前的量为读取的字符/字节数 tell()可以给出当前位置  
#读取了10个字符 位置却是11 原因是默认的编码用了11个字节才解码这10个字符
f.seek(3)     #将句柄位置 设置为指定的位置
print(f.read(1)) #此时应该是n 原文件的第3个(从0开始)字符
f.close()
print("------------------")
f1 = open(path,'rb')  #二进制形式读
print(f1.read(10))  #原始字节形式
print(f1.tell())
f1.close()

  • 写入文件

向文件写入,可以使用文件的write或writelines方法。比如:创建一个无空行的simple.txt  命名为tmp.txt:

with open('tmp.txt','w') as f:
    f.writelines(x for x in open(path) if len(x))
with open('tmp.txt','r') as f:
    lines = f.readlines()  #读取所有行,存在列表中 每一行为列表的一个元素
    print(lines)

  • 常用的文件方法

f = open(path,''),得到的f是一个“读写器”,类似于一个迭代器的东西,和之前一样需要使用类似于for循环的上下文或一些函数如read,write,readlines()读取所有行,readline()读取一行,等进行实体化,得到具体内容。

 

2.文件的字节和Unicode

Python文件默认操作是“文本模式”,即你需要处理Python的字符串(Unicode)。他与二进制模式相对,文件模式加一个b。 以上一节的文件(UTF-8编码,包含非ASCII字符)为例:

with open(path) as f:
    chars = f.read(10)
    print(chars)

UTF-8是长度可变的Unicode编码,当从文件请求一定数量的字符时,Python会从文件读取足够多(可能少至10或多至40)的字节进行解码。如果以‘rb’模式打开文件,则读取确切的请求字节数:

with open(path,'rb') as f:
    data = f.read(10)
    print(data)

取决于文本的编码,可以将字节解码为str对象,只有当每个编码的Unicode字符都完全成形时才能这么做:

文本模式结合open编码选项,提供一种更方便的方法将Unicode转换为另一种编码:

不要在二进制模式中使用seek。如果文件位置位于定义Unicode字符的字节的中间位置,读取后面会产生错误:

如果经常要对非ASCII字符文本进行数据分析,通晓Python的Unicode功能非常重要。

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值