文章目录

  • 读文件 open(mode='r')
  • 一个python面试题的例子
  • 写文件 open(mode='w')
  • JSON操作
  • Pickle操作

引用自:

  • python 文件读写操作
  • Python3读写JSON文件
  • 菜鸟网络——OS 文件/目录方法


模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
import os
print (os.getcwd())
os.chdir('newdir')
print (os.getcwd())
D:\01_Project\99_test
D:\01_Project\99_test\newdir

读文件 open(mode=‘r’)

打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的)

f = open('test.txt', 'r')
f
<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'>

r表示是文本文件,rb是二进制文件。(这个mode参数默认值就是r)

如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在

f = open('test.txt', 'r')
f
<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'>

文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

f.close()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:

file_path = r'D:\01_Project\99_test\newdir\test.txt'
try:f = open(file_path, 'r')print(f.read())
finally:if f:f.close()
Hello, world!

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法

with open(file_path, 'r') as f:print(f.read())
Hello, world!

python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量。

  • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
  • readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。
  • readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。

注意:这三种方法是把每行末尾的’\n’也读进来了,它并不会默认的把’\n’去掉,需要我们手动去掉。

with open('test.txt', 'r') as f1:list1 = f1.readlines()
list1
['Hello, world!']
with open('test.txt', 'a') as f:f.write('Hello, world!')
with open('test.txt', 'r') as f1:list1 = f1.readlines()
for i in range(0, len(list1)):list1[i] = list1[i].rstrip('\n')
list1
['Hello, world!Hello, world!']

对于read()和readline()也是把’\n’读入了,但是print的时候可以正常显示(因为print里的’\n’被认为是换行的意思)

with open('test.txt', 'r') as f1:list1 = f1.read()
print (list1)
list1
Hello, world!Hello, world!'Hello, world!Hello, world!'
with open('test.txt', 'r') as f1:list1 = f1.readline()
print (list1)
list1
Hello, world!Hello, world!'Hello, world!Hello, world!'

一个python面试题的例子

有两个文件,每个都有很多行ip地址,求出两个文件中相同的ip地址:

with open('data1.txt', 'r') as f1:list1 = f1.read()print (list1)
print ('*_'*30)
with open('data2.txt', 'r') as f1:list1 = f1.read()print (list1)
172.190.10.2
172.190.8.205
172.168.1.125
172.168.1.1
*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_
172.190.10.2
172.190.8.215
172.168.1.152
172.168.1.1
172.190.140.8
# coding:utf-8
import bisectwith open('data1.txt', 'r') as f1:list1 = f1.readlines()
for i in range(0, len(list1)):list1[i] = list1[i].strip('\n')
with open('data2.txt', 'r') as f2:list2 = f2.readlines()
for i in range(0, len(list2)):list2[i] = list2[i].strip('\n')list2.sort()
length_2 = len(list2)
same_data = []
for i in list1:pos = bisect.bisect_left(list2, i)if pos < len(list2) and list2[pos] == i:same_data.append(i)
same_data = list(set(same_data))
print(same_data)
['172.190.10.2', '172.168.1.1']

要点:

  • 用with
  • 处理行末的’\n’
  • 使用二分查找提高算法效率
  • 使用set快速去重。

写文件 open(mode=‘w’)

写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件

f = open('test.txt', 'w')
f.write('Hello, world!')
f.close()

注意:'w’这个模式是酱紫:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西。所以若不想清空原来的内容而是直接在后面追加新的内容,就用’a’这个模式。

我们可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险

with open('test.txt', 'w') as f:f.write('Hello, world!')

python文件对象提供了两个“写”方法: write() 和 writelines()。

  • write()方法和read()、readline()方法对应,是将字符串写入到文件中。
  • writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
f1 = open('test1.txt', 'w')
f1.writelines(["1", "2", "3"])
#    此时test1.txt的内容为:123
f1.close()f1 = open('test2.txt', 'w')
f1.writelines(["1\n", "2\n", "3\n"])
f1.close()
#    此时test2.txt的内容为:
#    1
#    2
#    3

关于open()的mode参数:

‘r’:读

‘w’:写

‘a’:追加

‘r+’ == r+w(可读可写,文件若不存在就报错(IOError))

‘w+’ == w+r(可读可写,文件若不存在就创建)

‘a+’ ==a+r(可追加可写,文件若不存在就创建)

对应的,如果是二进制文件,就都加一个b就好啦,例如在存储图片时:

‘rb’  ‘wb’  ‘ab’  ‘rb+’  ‘wb+’  ‘ab+’

JSON操作

  • dumps只完成了序列化为str,
  • dump必须传文件描述符,将序列化的str保存到文件中
  • loads 只完成了反序列化,
  • load 只接收文件描述符,完成了读取文件和反序列化

JSON(JavaScript Object Notation)即JavaScript对象表示法,一种轻量级,通用的文本数据格式。
JSON语法支持对象(Object),数组(Array),字符串,数字(int/float)以及true/false和null。
JSON拥有严格的格式,主要格式如下:

  • 只能用双引号,不能用单引号
  • 元素之间用逗号隔开,最后一个元素不能有逗号
  • 不支持注释
  • 中文等特殊字符传输时应确保转为ASCII码(\uXXX格式)
  • 支持多层嵌套Object或Array
import jsondict_var = {'name': 'Cactus', 'age': 18, 'skills': ['Python', 'Java', 'Go', 'NodeJS'], 'has_blog': True, 'gf': None
}

json.dumps()支持参数,indent为多行缩进空格数,sort_keys为是否按键排序,ensure_ascii=False为不确保ascii,及不将中文等特殊字符转为\uXXX等

data1 = json.dumps(dict_var)
data2 = json.dumps(dict_var, indent=2,sort_keys=True, ensure_ascii=False)
print (data1)
print (data2)
{"name": "Cactus", "age": 18, "skills": ["Python", "Java", "Go", "NodeJS"], "has_blog": true, "gf": null}
{"age": 18,"gf": null,"has_blog": true,"name": "Cactus","skills": ["Python","Java","Go","NodeJS"]
}
json_str = '''{"name": "Cactus","age": 18,"skills": ["Python", "Java", "Go", "NodeJS"],"has_blog": true,"gf": null
}'''print(json.loads(json_str))
print(json.loads(data2))
{'name': 'Cactus', 'age': 18, 'skills': ['Python', 'Java', 'Go', 'NodeJS'], 'has_blog': True, 'gf': None}
{'age': 18, 'gf': None, 'has_blog': True, 'name': 'Cactus', 'skills': ['Python', 'Java', 'Go', 'NodeJS']}

保存为JSON文件

with open("demo2.json", "w", encoding='utf-8') as f:# json.dump(dict_var, f)  # 写为一行json.dump(dict_var, f,indent=2,sort_keys=True, ensure_ascii=False)  # 写为多行

加载JSON文件

with open("demo2.json", encoding="utf-8") as f:data = json.load(f)print(data)
{'age': 18, 'gf': None, 'has_blog': True, 'name': 'Cactus', 'skills': ['Python', 'Java', 'Go', 'NodeJS']}

Pickle操作

  • pickle模块和json模块都有 dumps、dump、loads、load四种方法,而且用法一样

  • 不同的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串

  • pickle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码

  • pickle可以序列化函数,但是其他文件想用该函数,在该文件中需要有该文件的定义(定义和参数必须相同,内容可以不同)

  • pickle.dump(obj, file, protocol=None)

必填参数obj表示将要封装的对象

必填参数file表示obj要写入的文件对象,file必须以二进制可写模式打开,即“wb”

可选参数protocol表示告知pickler使用的协议,支持的协议有0,1,2,3,默认的协议是添加在Python 3中的协议3。

  • pickle.load(file,*,fix_imports=True, encoding=“ASCII”, errors=“strict”)

必填参数file必须以二进制可读模式打开,即“rb”,其他都为可选参数

import pickledict_var = {'name': 'Cactus', 'age': 18, 'skills': ['Python', 'Java', 'Go', 'NodeJS'], 'has_blog': True, 'gf': None
}
# dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
with open('demo3.pk', 'wb') as f:pickle.dump(dict_var, f)
with open('demo3.pk', 'rb') as f:data = pickle.load(f)
print (data)
{'name': 'Cactus', 'age': 18, 'skills': ['Python', 'Java', 'Go', 'NodeJS'], 'has_blog': True, 'gf': None}

File Operation相关推荐

  1. unpacking error : failed to extract...: failed to convert whiteout file... operation not permitted

    unpacking error : failed to extract-: failed to convert whiteout file- operation not permitted 问题背景: ...

  2. Mac OS X系统下,svn: Can't remove file Operation not permitted.解决方案

    当你的svn出现类似以下错误时,提示Operation not permitted之类的问题,说明项目下 .svn文件夹内的文件权限有问题. 一般是由于windows和mac操作系统同时操作同个svn ...

  3. c++ file operation (reference 5)

    二进制文件的处理 虽然有规则格式(formatted)的文本(到目前为止我所讨论的所有文件形式)非常有用,但有时候你需要用到无格式(unformatted)的文件--二进制文件.它们和你的可执行程序看 ...

  4. python文件拷贝到其他盘符_Python:文件操作技巧(File operation)

    import osimport shutilimport datetime''' 作用:将目录备份到其他路径. 实际效果: 假设给定目录"/media/data/programmer/pro ...

  5. oracle expdp ora39070,expdp时出错:ORA-39070: Unable to open the log file.

    最初由 zhpsam 发布 [B]执行EXPDP操作时出现ORA-29283: invalid file operation错误 SQL> create or replace directory ...

  6. Wait Event Disk file operations I/O

    ORALCE的等待事件有很多,今天在一个数据库的awr报告中发现了一个新的等待事件:Disk file operations I/O,官方解释如下: This event is used to wai ...

  7. Path Operation

    文章目录 getcwd() os.listdir(path) os.path.exists(path) chdir() mkdir() os.path.dirname(path) shutil.rmt ...

  8. 【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-with-resources语句

    I/O流 File File 常用方法 File 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 try-with- ...

  9. 【Java-IO】File、搜索删除剪切、字符集、字符编码、字节流、将内存中的数据写入文件、字符流、缓冲流、Scanner、格式化输出、数据流、对象流、序列化与反序列化、Files工具类

    IO 文章目录 IO 简介 File 分隔符.大小写 常用方法 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 字节 ...

最新文章

  1. c++中static_cast用法与uchar/char的区别
  2. sql 游标_SQL基础丨游标
  3. 任何时候不要把普通PC机接入到三层交换机
  4. OpenLayers事件处理Event.js(七)
  5. 实现仿简书选取内容生成分享图片效果
  6. 从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素
  7. python千位分隔符_python – 为pandas数据帧中的整数设置千位分隔符
  8. AngularJs 相应回车事件
  9. 《Online Filtering Training Samples for Robust Visual Tracking》解析
  10. activity 变成后台进程后被杀死_Android开发后台服务
  11. javascript毫秒计时器_JavaScript原生秒表、计时器
  12. 关于水晶易表的简介及水晶易表安装初识
  13. JavaScript基础--DOM部分02--李南江
  14. 文件上传2-搭建uploads靶场
  15. Selenium04-selenium中的Xpath元素定位方法爬虫实践
  16. 应用内悬浮窗适配方案实战
  17. 2022-忙碌的一年
  18. django搭建个人博客(一)
  19. echarts 饼图、柱状图、折线图 切换
  20. 计算机系歌,科学网—计算机之歌 - 刘钢的博文

热门文章

  1. 使用Gpg4Win+Outlook Express实现发送和接收加密邮件
  2. Maven核心概念(转)
  3. [Effective JavaScript 笔记]第61条:不要阻塞I/O事件队列
  4. c#实现播放器的集中方式
  5. 如何才能做到网站高并发访问?
  6. Linux0.11 kernel/exit.c中的free_page_tables()
  7. 【Java】身份证的验证
  8. 【线程】——线程的启动和中断
  9. Linux服务器性能监控工具
  10. AIX 6.1环境 yum的安装方法