文件操作

文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的。本篇博客中将主要对常见的文本格式文件和Excel文件的相关操作进行介绍。

一、文本文件

1.1 文件操作流程

  1、打开文件,获得文件句柄,并赋值给一个变量 ;

  2、通过句柄对文件进行相关操作;

  3、关闭文件

示例:

 # -*- coding:utf-8 -*-
# author: cdc
# date: 2018/8/23 f = open('动物世界.txt','r',encoding='utf-8')
content = f.read()
print(content)
f.close() #***************运行结果*****************
'''
东打一下西戳一下
动物未必需要尖牙
示爱的方法有礼貌或是我管它
要将情人一口吞下
还要显得温文尔雅
螳螂委屈的展示旧伤疤
......
'''

open函数中,第一个参数为文件存储的位置+文件名(我在本地测试时文件与代码同级),第二个参数为文件的操作模式,第三个参数为操作的编码方式。

注意:文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要encoding='utf8'。文件如果是gbk保存的,则直接打开即可。

1.2 文件的操作模式

========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
========= ===============================================================

示例:

 # -*- coding:utf-8 -*-
# author: cdc
# date: 2019/1/21 # 只读文件
f = open('a.txt','r',encoding='utf-8')
f.read()
f.close() # 只写文件
# 注意: 1.若无该文件,写文件操作时会自动创建;2.再次写入时会从开头写,将原来的内容覆盖
f = open('a.txt','w',encoding='utf-8')
f.write('helloll')
f.close() # 以追加模式写入,会接着上一次的地方继续写
f = open('a.txt','a',encoding='utf-8')
f.write('')
f.close() # 以读写的模式操作文件
f = open('a.txt','r+',encoding='utf-8')
f.read(5)
f.write('')
f.read()
f.close() # 以写读的模式操作文件
f = open('a.txt','w+')
print(f.read(5)) # 什么都没有,因为先格式化了文本
f.write('hello cdc')
print(f.read()) #还是read不到
f.seek(0)
print(f.read()) # 以二进制方式读文件
f = open('a.txt','rb')
content = f.read()
print(type(content))
f.close() # 以二进制方式写文件
f = open('a.txt','wb')
f.write('hello alvin!'.encode())
f.close()

1.3 文件操作的具体方法

文件内容的读取:

 f.read()               # 将文件内容全部读出来
f.read(5) # 读取五个字节的内容
f.readline() # 读取一行
f.readlines() # 将所有内容以换行符为准分割,形成一个列表对象

查看光标位置及光标操作:

 #查看光标当前位置
f = open("a.txt","r",encoding="utf8")
print(f.tell())
print(f.read(5))
#一个中文默认为是三个字符
print(f.tell())
f.seek(0) #调整光标位置
print(f.read(5))
 f = open('a.txt', 'rb', )
f.read(3)
f.seek(3)
print(f.read(3)) f.seek(3,1) # 1为从当前位置,移动3个字节
print(f.read(3)) f.seek(-4,2) # 2为从从文件末尾算,向前移动4个字节
print(f.read(3))
f.close()

flush操作:将缓冲区的内容刷新到终端

 import sys,time
for i in range(30):
sys.stdout.write("*") #在缓冲区内写内容
sys.stdout.flush() #将缓冲区内容刷新到终端显示
print("*",end='',flush=True)
time.sleep(0.2)
f = open("小重山","w",encoding="utf8")
f.truncate() #截断操作,只保留光标前的内容,不设置参数时默认光标位置为0

1.4 with方法

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

 with open('a.txt','r',encoding='utf-8') as f:
f.readline()

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。with支持同时对多个文件的上下文进行管理,即:

 with open('a.txt','r',encoding='utf-8') as f_read, open('b.txt','w',encoding='utf-8') as f_write:
f_read.readline()
f_write.write('hello')

1.5  踩坑啦!!!

对于文件的读取操作,本人在公司遇到过不少的麻烦。。。由于每个人使用的文本编辑器不同,并且不是所有人都能关注到语言格式的问题,所以往往存储的文件编码格式五花八门,等到这些数据到我手里需要处理的时候。。。我的内心    (▼ヘ▼#)     (╯°Д°)╯︵┻━┻

起初我打算自己写一套脚本来识别各种语言格式并统一转化成utf-8格式,无奈编码格式实在是太多种了,很难判断完全。后来我发现有一个非常巧妙的方法:

 with open('filename','r',encoding='iso-8859-1') as f:
for line in f.readlines():
content = bytes.decode(line.encode('utf-8'))
print(type(content))

以'iso-8859-1'的编码方式去读取文件,无论哪种编码格式的文件都可以以bytes类型的形式被读取出来,接着只要再将bytes转换成str,并以'utf-8'格式编码就大功告成了!

还有一种情况,在已经知道文件是以'utf-8'编码格式存储的情况下,以'utf-8'方式去读取还是报错:

 with open('a.txt','r',encoding='utf-8') as f:
for i in f.readlines():
print(i) # 结果报错
#'\ufeffHello,World\n'

a.txt的文件编码格式为utf-8,但是读取的第一行前面会出现非法字符'\ufeff',后来发现是utf-8编码有无BOM的原因造成的。BOM,即Byte Order Mark,就是字节序标记,具体原理感兴趣的童鞋可以谷歌了解一下!遇到这种情况只需要在读取文件的时候如下操作即可:

 with open('a.txt', 'r', encoding='utf-8-sig') as f:
for i in f.readlines():
print(i)

二、Excel文件

python中操作excel文件的第三方库有很多,在这边主要介绍xlrd、xlwt、openpyxl三种常用的库。

To be continue......


craw_pics

Python学习—基础篇之文件操作的更多相关文章

  1. Node基础篇(文件操作)

    文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...

  2. python学习笔记(十)、文件操作

    在前面我们了解到了没得模块,其中有一个模块为fileinput,为文件操作模块,不知道小伙伴们是否还记得? 1 打开文件 要打开文件,可以使用fileinput中的fileinput.input函数进 ...

  3. python学习 day07打卡 文件操作

    本节主要内容: 初识文件操作 只读(r,rb) 只读(w,wb) 追加(a,ab) r+读写 w+写读 a+追加写读 其他操作方法 文件的修改以及另一种打开文件句柄的方法 一. 初识文件操作 使用py ...

  4. Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

    文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...

  5. Python学习之路4 - 文件操作&编码转换

    文件操作 文件操作大概分三步: 把文件打开. 操作文件. 把文件关上. 打开文件 打开文件用open()函数,打开成功后返回一个资源,具体语法如下. open(要打开的文件,打开方式,打开文件的格式, ...

  6. Python学习(五) —— 文件操作

    一.文件操作 1.文件操作:数据持久化的一种      步骤:找到文件,打开文件,操作:读.写.追写,关闭文件      打开文件:f = open(文件路径,操作模式,编码方式),f:文件句柄.文件 ...

  7. Python学习笔记七:文件操作

    文件操作 对照一个word文件的操作方式,来体会文件操作的内容 打开文件:f=open(“file”),提示编码错误,windows默认是GBK f=open(“file”,encoding=”utf ...

  8. python基础篇 08 文件操作

    本节主要内容:1. 初识⽂件操作2. 只读(r, rb)3. 只写(w, wb)4. 追加(a, ab)5. r+读写6. w+写读7. a+写读(追加写读)8. 其他操作⽅法9. ⽂件的修改以及另⼀ ...

  9. Python ( 学习 基础篇第一部 )

    目录 注释 注释的分类 注释的注意点 变量 变量的概念 变量的声明 变量的命名 变量的交换 变量的缓存机制 常量 进制 进制的转换 原码 反码 补码 六大数据类型 Number 的四大类 字符串 st ...

随机推荐

  1. 01bootstrap_基本结构和布局

    01bootstrap_基本结构 学习bootstrap需要下载必要的文件:www.bootcss.com 基本结构 container page-header 布局 1.响应式布局:containe ...

  2. mongo 索引,速度

    (如有打扰,请忽略)阿里云ECS大羊群,2U4G低至1.4折,限实名新用户,需要的点吧https://promotion.aliyun.com/ntms/act/vm/aliyun-group/tea ...

  3. 策略模式(Strategy )

    为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy {    public void algorithmInterface(); ...

  4. lvs UDP端口负载均衡配置

    ! Configuration File for keepalived global_defs { notification_email { test@163.com } notification_e ...

  5. mysql插中文出现错误 "incorrect string value:\x.....

    mysql字符集的问题: mysql的表格整理应该改为gbk_chinese_ci,每个需要汉字的字段属性的整理也改为gbk_chinese_ci,

  6. python3 访问百度返回压缩格式

    import urllib, urllib.request, urllib.parse import random import zlib import re import os, time Save ...

  7. RDO快速部署OpenStack

    RDO快速部署OpenStack 1.RDO是什么 RDO是红帽Red Hat Enterprise Linux OpenStack Platform的社区版,类似RHEL和Fedora,RHEV和o ...

  8. oracle批量删除某个用户下的所有表

    打开sql developer,输入如下语句,把USERNAME替换为需要删除的的用户名 然后把查询出来的结果复制出来执行一遍就行了. SELECT 'DROP table '||table_name ...

  9. jstack命令定位java程序CPU利用率高的代码位置

    高手是怎么使用jstack精确找到异常代码的(java程序CPU利用率高的情况) 请jstack神器来帮忙 本文介绍Linux环境下使用jstack定位问题的秘笈1.[top命令]找到CPU利用率持续 ...

  10. Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)

    一.SQLite升级和降级需要考虑的细节 ①  SQLite升级: v3.0数据库版本 [onUpgrade 情况:n-1,onCreate 情况:1]                        ...