1 打开文件

文件操作步骤:

1、打开文件获取文件的句柄,句柄就理解为这个文件

2、通过文件句柄操作文件

3、关闭文件。

1.1 打开方法

f = open('xxx.txt')  #需f.close()关闭文件

f = open(r'E:\PycharmProjects\Python3_study\Day3\n文件读写',encoding='utf-8')   #'r'可以防止字符串在使用的时候不被转义

with open(<filename>,<mode>) as f1,open(<filename>,<mode>) as f2:  #文件使用结束后自动关闭文件

1.2 打开模式

  • a+
 f = open('test.txt','a+', encoding = 'utf-8')
f.seek(0) #指针在末尾,需要将其移至开头
print(f.read()) #读出所有内容
 hello world
你好,世界

a+执行结果

  • w+
 f = open('test.txt','w+', encoding = 'utf-8')
f.seek(0)
print(f.read()) #发现原来的内容已清空
f.write('这是新的')
f.seek(0)
print(f.read()) #可以读到刚刚写入的内容
 这是新的

w+执行结果

  • r+
 f = open('test.txt','r+', encoding = 'utf-8')
f.write('这是r+') #写入后指针跑到了新写入内容的末尾
f.seek(0)
print(f.read()) #从开头开始替换
 这是r+rld
这是新的

r+执行结果

2 文件读

2.1 读文件方法

  • f.readline():读文件的一行,文件指针移动到下一行
  • f.readlines():读从文件指针当前位置至末尾的所有行,文件指针移动到末尾。取文件里面所有内容,返回的是一个list,每一行的内容放到一个list
  • f.read():读从文件指针当前位置至末尾的所有内容,文件指针移动到末尾。读取文件里面所有的内容,字符串
  • for line in f:  直接循环文件对象,每次循环的line是文件的当前行内容,进入下一循环,则循环文件的下一行的内容
 f = open('file.txt','r',encoding='utf-8')    # 默认是当前路径
print('1=====',f.readline()) #读取文件一行的数据
print('2=====',f.readline()) #读取文件第二行的数据,即接下来一行
print('3=====',f.readlines()) #读取文件所有的数据,返回一个列表(从指针开始)
print('4=====',f.read()) # 获取文件里的所有内容(从指针开始)

2.2 日志分析

 #写脚本每隔一分钟读日志文件,一分钟访问超200,禁止访问

 #1读取文件内容,获取ip
#2把每个ip地址存起来 .
#3判断ip访问的次数是否超过200
#4加入黑名单 print import time point = 0#初始位置 while True: f = open('access.log','r', encoding = 'utf-8')
IP = {} f.seek(point) for line in f: #一行一行读
str = line.split()[0] #split():通过指定分隔符对字符串进行切片,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
count = 0
if str in IP:
IP[str] += 1
else:
IP[str] = 1 point = f.tell() f.close() for k, v in IP.items():
if v > 200:
print(k)

3 文件写

3.1 写文件方法

  • f.writelines(listname):写一个list。类似于  for i in list: f.write(i)。所以,虽然writelines()可以写入string及list,但是字符串最好用write(),list最好用writelines()。自动循环,将list每一个元素追加写到文件中,如果想加换行符,可以将换行符放在list表里
  • f.write(str):写一个字符串。不能自动循环,参数可自行加换行符,如 f.write('\n'+name)
  • flush():  write后再调用flush,会将缓冲区里的内容立即写到磁盘上。写文件机制:cpu->内存->磁盘(为了提高效率,内存有缓冲区,当缓冲区满了,再将缓冲区的内容写到磁盘上)。

4 修改文件

4.1 方法一 不常用

  # 文件修改的方法:
# 1、简单粗暴直接(适用于数据量少的情况)
# 1)读出来文件所有内容,保存为一个变量
# 2)对字符串变量进行处理
# 3)除旧存新
with open('a.data','a+',encoding='utf-8') as f:
f.seek(0)
data = f.read() #获取原来的内容
print('修改前:%s'%data)
new_data = data.replace('你','You')
print('修改后:%s'%new_data) #修改内容
f.seek(0)
f.truncate() # 清空文件内容,需要将文件指针移到头部再清空
f.write(new_data) #将修改后的内容存入文件
f.flush()
 修改前:你好,
地球!
修改后:You好,
地球!

结果

4.2 方法二 常用★

 # 高效修改(一行一行修改)
# 1)循环取每一行,去除前面的空格
# 2)去除空行
# 3)你替换成you
# 4) 写到新文件里
# 5)把原来文件删除,把新文件的名字改成原文件的名字
import os
with open('a.data','r',encoding='utf-8') as f1, open('a2.data','w',encoding='utf-8') as f2:
for line in f1: # 1)循环取每一行,去除前面的空格
line = line.lstrip() # 1)去除前面的空格
if line: # 2)去除空行
print('修改前:%s'%line)
line = line.replace('You','你们') # 3)You替换成你们
print('修改后:%s'%line)
f2.write(line) # 4) 写到新文件里
os.remove('a.data'); # 5)把原来文件删除
os.rename('a2.data','a.data') # 5)把新文件的名字改成原文件的名字
 修改前:You好,

 修改后:你们好,

 修改前:地球!
修改后:地球!

结果

  • os.remove('a.data'); #删除文件
  • os.rename('a2.data','a.data') #修改文件名

5 JSON处理

5.1 json.load(file)

自动读取文件中的json,转换成字典

{
"xiaohei": "",
"海龙": "",
"tanailing": "",
"xiaojun": ""
}

文件 stus.json

 import json
f = open('stus.json',encoding='utf-8')
user_dic = json.load(f)
print(user_dic)
{'xiaohei': '', '海龙': '', 'tanailing': '', 'xiaojun': ''}

运行结果

5.2 json.dump(dic, file, indent=4, ensure_ascii=False)

把字典转成json串,并自动写入文件中。

dump参数是(字典,文件句柄,indent)。indent用于缩进美化json串的。

ensure_ascii=False用于写文件时有unicode时用,正常显示出中文来。

 import json
stus = {'xiaojun':'','xiaohei':'','tanailing':''
,'海龙':''}
f = open('stus2.json','w',encoding='utf-8')
json.dump(stus,f,indent=4,ensure_ascii=False)
生成文件'stus2.json', 文件内容是由字典生成的json

运行结果

5.3 json.loads(str)

把json串(字符串)转成字典。loads参数是字符串

 import json

 s='''
{
"error_code": 0,
"stu_info": [
{
"id": 309,
"name": "小白",
"sex": "男",
"age": 28,
"addr": "河南省济源市北海大道32号",
"grade": "天蝎座",
"phone": "18512572946",
"gold": 100
},
{
"id": 310,
"name": "小白",
"sex": "男",
"age": 28,
"addr": "河南省济源市北海大道32号",
"grade": "天蝎座",
"phone": "18516572946",
"gold": 100
}
]
}
''' res = json.loads(s) #json串(字符串),转成字典
print(res)
{'error_code': 0, 'stu_info': [{'id': 309, 'name': '小白', 'sex': '男', 'age': 28, 'addr': '河南省济源市北海大道32号', 'grade': '天蝎座', 'phone': '', 'gold': 100}, {'id': 310, 'name': '小白', 'sex': '男', 'age': 28, 'addr': '河南省济源市北海大道32号', 'grade': '天蝎座', 'phone': '', 'gold': 100}]}

运行结果

5.4 json.dumps(dic,ensure_ascii=False)

把字典转成json串(字符串),loads参数是字典,需要手动write

 import json
stus = {'xiaojun':'','xiaohei':'','tanailing':'','海龙':''}
res2 = json.dumps(stus,indent=8,ensure_ascii=False)
print(res2)
{
"xiaojun": "",
"xiaohei": "",
"tanailing": "",
"海龙": ""
}

运行结果

参数说明:

  • 输出中文需要指定ensure_ascii=False,如果使用默认配置, 输出的会是‘ASCII字符
  • indent参数根据数据格式缩进显示,读起来更加清晰 (数值代表缩进的位数)

最新文章

  1. UVA 11768 Lattice Point or Not(扩展欧几里德)
  2. windows使用nginx实现网站负载均衡测试实例
  3. [题解]codevs1001 舒适的路线
  4. SpringMVC报错The request sent by the client was syntactically incorrect ()
  5. JS访问剪切板中的图片
  6. 一行能装逼的JavaScript代码
  7. ubuntu server 14.10 安装 nodejs
  8. mybatis09
  9. EasyUI easyui-combobox 重复发送请求
  10. Qt双缓冲机制:实现一个简单的绘图工具(纯代码实现)
  11. Linux中进行挂起(待机)的命令说明
  12. yaml 格式
  13. 连接mysql 出现 1005 error(150) , error(121)的错误
  14. 词典的实现(3)--使用JAVA类库ArrayList实现Map数据结构
  15. yum源制作
  16. GO注释
  17. 在Redhat 7.3中采用离线方式安装Docker
  18. [Canvas]碰撞球
  19. 80端口被系统进程PID-4占用解决办法
  20. javaweb学习3——验证码

热门文章

  1. python - MySQLdb 事务处理及批量执行executemany
  2. WPF DevExpress Chart控件多Y轴,指定数据参考的Y轴
  3. Python基本语法_集合set/frozenset_内建方法详解
  4. hibernate中get和load区别
  5. 五:flask-url_for使用详解
  6. fiddler之请求过滤(Filters)
  7. 003-Django创建模版配置流程
  8. C++ Primer笔记(1)——连续读取数据、类型对应的尺寸、类型转换、字符串分行写法
  9. FTP搭建YUM源服务器
  10. IDEA中解决 git pull 冲突