python基础

文件读写  凡是读写文件,所有格式类型都是字符串形式传输

  只读模式(默认) r 

    f=open('a.txt','r')#文件不存在会报错
    print(f.read())#获取到文件所有内容
    f.close()#关闭文件

  读写模式 r+

    f=open('a.txt','r+')#文件不存在会报错,可读可写可追加
    f.write('')#
    f.close()

  只写模式 w

    f=open('a.txt','w')#w会一打开文件未被清空,如果文件不存在会新建
    f.write('a','')
    f.close()#关闭文件

  写读模式 w+  

    f=open('a.txt','w+')#w会一打开文件未被清空,如果文件不存在会新建
    print(f.read())#
    f.close()

    追加写模式 a  

    f=open('a.txt','a')#可以追加写,不存在可以新建,但是不能读
    f.write('a','')
    f.close()#关闭文件

  追加读模式 a+

    f=open('a.txt','a+')#a+可读可写可追加文件内容,如果文件不存在会新建,
    print(f.read())#获取到文件所有内容
    f.write('a','123456\n')#\n换行符,从文件取到代码中会隐藏换行符用strip方法处理
    f.write('b','123456\n')
    f.seek()#文件指针移动至最前面
    f.flush()#清缓冲区,直接写入磁盘中,这样做会直接看到磁盘文件的数据,但是在正式环境中会造成大量io
    f.close()#关闭文件

    #如果有中文在f=open('a.txt','r',encoding='utf-8')

    #读取二进制文件在模式中加b 如f= open('123.avi','rb+')

    #f.flush()表示立刻把缓存区中的数据写到磁盘中

    #"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  read(write),readline(writeline),readlines(writelines)

    read()       获取文件所有内容到内存,如果是大文件内存放不下会造成溢出,同理write 

    print(f.readlines())  \     获取文件所有内容,并以每行字符串形式输出。如果是大文件内存放不下会造成溢出。内置for循环,同理writelines,如果是字符串,直接传字符串不用readlines或者

               writelines,效率低

    print(f.readline())   获取文件首行内容,并以字符串形式输出,文件指针标记此次读取内容之后,如果再次readline,输出后面一行的内容,同理writeline

  文件读写与for  高效读取文件内容

    一、

    f=open('a.txt',encoding='utf-8')  #f称为文件对象,文件句柄
    for line in f:
      print(line)

    二、


    f=open('a.txt',encoding='utf-8')
    while True:
  line = f.readline()
  if line != '':
  print(line)
  else:
  break
   f.close()

    三、 

   f = open('product.json', 'r', encoding='utf-8')
   res = f.read()
   if len(res) == :
  print("文件为空")
   else:
  print(res)

  文件指针    

    f.seek(0)   #文件指针移动至最前面

    f,tell()      #记录当前指针位置

#python监控access.log文件及tell与seek的混用
import time
point = 0
while True:
with open('access.log', encoding='utf-8') as f:
if f:
point_action = f.seek(point)
all_ip = []
for i in f:
ip = i.split("-")[0]
all_ip.append(ip)
point = f.tell()
all_ip_set = set(all_ip)
for i in all_ip_set:
if all_ip.count(i) > 200:
print("被封ip为%s,次数为%s" % (i, all_ip.count(i)))
time.sleep(60)

  文件修改

    方法1  简单粗暴,小文件适用

    f = open('a.txt',encoding='utf-8')#打开文件
    res = f.read().replace('a','b')#读取文件内容,把文件中所有a替换成b
    f.close()#关闭文件
    f = open('a.txt','w',encoding='utf-8')#以w模式清空文件
    f.write(res)#再把内存中的修改好的文件写入文件句柄中,从而达到文件修改的目的
    f.close()

    方法2 简单粗暴,小文件适用

    f = open('a.txt','a+‘,encoding='utf-')#以a+模式打开文件
    f.seek()#指针移动到最前面
    res = f.read().replace('a','b')#替换
    f.seek()#再把指针移到最前面,不然指针在末尾,清不掉文件内容了
    f.truncate()#清空文件内容
    f.write(res)#
    f.close()

    方法3 适用于大文件

    import os #导入模块
    f1 = open('a.txt',encoding='utf-8')#打开原来文件
    f2 = open('a.txt.bak','w',encoding='utf-8')打开修改文件
    for line in f:#循环
      new_line = line.replace('a','b')#替换
      f2.write(new_line)#写入修改文件
    f1.close()
    f2.close()
    os.remove('a.txt')#删除文件
    os.rename('a.txt.bak','a.txt')#文件重命名

  with用法   用with不需要close方法,with自动关闭 

'''将a文件的内容写到b文件中'''
with open('a.txt','r') as rf,open('b.txt','a+') as wf :
for line in rf.read():
wf.write(line)

序列化  就是从内存写到硬盘的过程,反序列化就是从磁盘读到内存的过程,我们的代码其实电脑也不是很明白,只有转换成二进制,然后电脑自己再转换成机器语言才明白

python处理json  查看json格式是否有问题 www.bejson.com

  r = '''{"a":1,"b":2,"c":3}'''#json串就是字符串

  import json #导入序列化json模块

  res = json.loads(r)#把json串变成字典,与load区别在于loads后面参数对应的是字符串,简单来说使用load可以直接操作数据库,不用read了。使用loads可以用read写到内存再进行下一步对数据库的操作

  res2=json.dumps(res)#把字典变成json串,与dump区别在于dumps后面参数对应的是字符串,简单来说使用dump可以直接操作数据库,不用read了。使用dumps可以用read写到内存再进行下一步对数据库的操作

    dumps参数  #indent缩进,中文避免乱码,ensure_ascii=False

      res2=json.dumps(res,indent=4,ensure_ascii=False)

  json处理的优劣:json模块只支持str,int ,tuple ,list ,dict的数据类型,因为数据传输到文本是json格式,所以支持的语言也是很多的

python操作pickle

test = {
"port1": {
"username": "小北",
"password": 123456,
"sex": "男",
"action": "sport"
},
"port2": {
"username": "小爱",
"password": 123456,
"sex": "女",
"action": "dance"
}
}
print(type(test)) #<class 'dict'> import pickle
wf = open('pickle_test','wb')
pickle.dump(test,wf)
wf.close()
rf = open('pickle_test','rb')
p = pickle.load(rf)
print(p)
rf.close()
res = pickle.dumps(test)
print(res) print(pickle.loads(res))
#pickle对象操作
test = {
"port1": {
"username": "小北",
"password": 123456,
"sex": "男",
"action": "sport"
},
"port2": {
"username": "小爱",
"password": 123456,
"sex": "女",
"action": "dance"
}
}
class Fuc_test(object):
def __init__(self,doc):
self.doc = doc
p = Fuc_test(test)
print(p)#<__main__.Fuc_test object at 0x000000000241A668> import pickle
wf = open('pickle_test','wb')
pickle.dump(p,wf)#写入文件 rf = open('pickle_test','rb')
res = pickle.load(rf)#读文件
print(res)#<__main__.Fuc_test object at 0x000000000241A6A0>
print(res.doc)#{'port1': {'username': '小北', 'password': 123456, 'sex': '男', 'action': 'sport'}, 'port2': {'username': '小爱', 'password': 123456, 'sex': '女', 'action': 'dance'}}

  pickle的优劣:pickle支持python里的所有数据类型,包括所有对象,但是缺点是只能在python里使用

 

python操作shelve    shelve模块是对pickle的封装,其继承了只能在python里使用的缺点,但实现了dumps,loads多次的情况

import shelve
res =shelve.open('shelve')
#字段新增
res['dict'] = test
print(res.get('dict'))#{'port1': {'username': '小北', 'password': 123456, 'sex': '男', 'action': 'sport'}, 'port2': {'username': '小爱', 'password': 123456, 'sex': '女', 'action': 'dance'}} #字段修改
res['username'] = 'niao'
print(res.get('username'))#niao
res['username'] = 'nihao'#注意字段修改只能在修改整条字段的value进行覆盖,不能改value里面的某一个值
print(res.get('username'))#nihao #字段删除
res['password'] = ''
print(res.get('password'))#
res.pop('password')
print(res.get('password'))#None #字段查看
for i,j in res.items():#循环打印res对象中所有键值对
print(i,j)
res.close()  #关闭对象

  shelve模块的优劣:一样是只能对python操作,其本身对数据增加了key,value,key必须为字符串,key可以为任何数据类型,只要是持久化成为了其优势

文件处理小妙招

  复制文件内容

  with open('b.txt', 'w', encoding='utf-8') as f2:
  with open('a.txt', 'r', encoding='utf-8') as f1:
  for line in f1:
  f2.write(line)

  取文件内容

    s = ''
f = open('product.txt', 'r', encoding='utf-8')
for line in f:
if line == '':
print("内容为空")
else :
s = s + line
print(s)

版权声明:本文原创发表于 博客园,作者为 RainBol本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

python学习之文件读写,序列化(json,pickle,shelve)的更多相关文章

  1. python学习之文件读写入门(文件读的几种方式比较)

    1.文件读写简单实例:(以w写的方式打开一个文件,以r读一个文件) # Author : xiajinqi # 文件读写的几种方式 # 文件读写 f = open("D://test.txt ...

  2. Java学习笔记-文件读写和Json数组

    Java文件读写 Java中I/O流对文件的读写有很多种方法,百度后主要看了以下三种 第一种方式:使用FileWriter和FileReader,对文件内容按字符读取,代码如下 String dir ...

  3. Day 4-5 序列化 json & pickle &shelve

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 反序列化: 把字符转成内存里的数据类型. 用于序列化的两个模块.他 ...

  4. 序列化 json pickle shelve configparser

    一 什么是 序列化 在我们存储数据或者 网络传输数据的时候,需要对我们的 对象进行处理,把对象处理成方便我们存储和传输的 数据格式,这个过程叫序列化,不同的序列化,结果也不相同,但是目的是一样的,都是 ...

  5. 保存数据到文件的模块(json,pickle,shelve,configparser,xml)_python

    一.各模块的主要功能区别 json模块:将数据对象从内存中完成序列化存储,但是不能对函数和类进行序列化,写入的格式是明文.  (与其他大多语言交互的类型) pickle模块:将数据对象从内存中完成序列 ...

  6. Python(序列化json,pickle,shelve)

    序列化 参考:https://www.cnblogs.com/yuanchenqi/articles/5732581.html # dic = str({'1':'111'}) # # f = ope ...

  7. Python学习第十二课——json&pickle&XML模块&OS模块

    json模块 import json dic={'name':'hanhan'} i=8 s='hello' l=[11,22] data=json.dumps(dic) #json.dumps() ...

  8. python学习之文件读写操作

    open函数 在使用文件之前,需要先打开,即使用open函数 如: files=open("文件路径","操作方式") 解释如下: (1.files:为文件对象 ...

  9. python序列化: json & pickle & shelve 模块

    一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...

随机推荐

  1. C#使用KingAOP实现AOP面向切面编程一

    AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 实现AOP主要由两种方式,一种是编译时静态植入,优点是 ...

  2. Rhino脚本引擎技术介绍

    引用:http://p.primeton.com/articles/54c1e255be20aa4735000001 http://blog.csdn.net/u013292493/article/d ...

  3. 深入理解linux内核-内存寻址

    逻辑地址:由一个段和偏移量组成的地址线性地址(虚拟地址):物理地址:CPU的物理地址线相对应的地址32或36位 多处理器系统中每个CPU对应一个GDT 局部线程存储:用于线程内部的各个函数调用都能访问 ...

  4. Time & Space Complexity

    Quick Sort: Time complexity: best case O(n*lgn), worst case O(n^2) Space complexity: Best case O(lgn ...

  5. 【牛客网】Longest Common Subsequence

    [牛客网]Longest Common Subsequence 发现只有d数组最格路 于是我们把前三个数组中相同的数记成一个三维坐标,同一个数坐标不会超过8个 从前往后枚举d,每次最多只会更新不超过8 ...

  6. python学习-28 map函数

    1. num_1 = [10,2,3,4] def map_test(array): ret = [] for i in num_1: ret.append(i**2) # 列表里每个元素都平方 re ...

  7. PAT(B) 1014 福尔摩斯的约会(Java)

    题目链接:1014 福尔摩斯的约会 注意 三个字眼:"第1对","第2对","第1对",因此如果你用了循环,别忘了break,因为后面也可能 ...

  8. asp.net core-1.在控制台创建ASP.NET Core应用程序

    创建asp.net core应用程序,需要先把环境安装好,我这边选的是vs2017 第一步先执行dotnet 我执行dotnet --help可以把所有的命令全部列出来: 红框内就是我们可以用来初始化 ...

  9. 方法引用(method reference)

    目录 方法引用(method reference) 1. 含义 2. 分类 3. 总结 方法引用(method reference) 1. 含义 方法引用实际上是 Lambda 表达式的一种语法糖. ...

  10. hdu 1698 线段数的区间更新 以及延迟更新

    先说说区间更新和单点更新的区别 主要的区别是搜索的过程 前者需要确定一个区间 后者就是一个点就好了 贴上两者代码 void updata(int i)//单点更新 { int l=stu[i].l; ...