Python3之文件的读、写、修改操作

文件yesterday

Somehow, it seems the love I knew was always the most destructive kind
不知为何,我经历的爱情总是最具毁灭性的的那种
Yesterday when I was young
昨日当我年少轻狂
The taste of life was sweet
生命的滋味是甜的
As rain upon my tongue
就如舌尖上的雨露
I teased at life as if it were a foolish game
我戏弄生命 视其为愚蠢的游戏
The way the evening breeze
就如夜晚的微风
May tease the candle flame
逗弄蜡烛的火苗
The thousand dreams I dreamed
我曾千万次梦见
The splendid things I planned
那些我计划的绚丽蓝图
I always built to last on weak and shifting sand
但我总是将之建筑在易逝的流沙上
I lived by night and shunned the naked light of day
我夜夜笙歌 逃避白昼赤裸的阳光
And only now I see how the time ran away
事到如今我才看清岁月是如何匆匆流逝
Yesterday when I was young
昨日当我年少轻狂
So many lovely songs were waiting to be sung
有那么多甜美的曲儿等我歌唱
So many wild pleasures lay in store for me
有那么多肆意的快乐等我享受
And so much pain my eyes refused to see
还有那么多痛苦 我的双眼却视而不见
I ran so fast that time and youth at last ran out
我飞快地奔走 最终时光与青春消逝殆尽
I never stopped to think what life was all about
我从未停下脚步去思考生命的意义
And every conversation that I can now recall
如今回想起的所有对话
Concerned itself with me and nothing else at all
除了和我相关的 什么都记不得了
The game of love I played with arrogance and pride
我用自负和傲慢玩着爱情的游戏
And every flame I lit too quickly, quickly died
所有我点燃的火焰都熄灭得太快
The friends I made all somehow seemed to slip away
所有我交的朋友似乎都不知不觉地离开了
And only now I'm left alone to end the play, yeah
只剩我一个人在台上来结束这场闹剧
Oh, yesterday when I was young
噢 昨日当我年少轻狂
So many, many songs were waiting to be sung
有那么那么多甜美的曲儿等我歌唱
So many wild pleasures lay in store for me
有那么多肆意的快乐等我享受
And so much pain my eyes refused to see
还有那么多痛苦 我的双眼却视而不见
There are so many songs in me that won't be sung
我有太多歌曲永远不会被唱起
I feel the bitter taste of tears upon my tongue
我尝到了舌尖泪水的苦涩滋味
The time has come for me to pay for yesterday
终于到了付出代价的时间 为了昨日
When I was young
当我年少轻狂

  

文件的读写修改

# Author:Allister.Liu
# !/usr/bin/env python
import sys

"""
Python3.x对文件的操作

文件的打开模式:(其中r, r+, w+, w, a, a+ 比较常用)
    r	只读。文件指针被放置在文件的开头。这是默认模式。
    rb	只能以二进制格式读取。文件指针被放置在文件的开头。这是默认模式。
    r+	用于读和写文件。文件指针置于该文件的开头。【最常用】
    rb+	用于读取和写入二进制格式的文件。文件指针置于该文件的开头。
    w	只写。如果文件存在覆盖该文件。如果该文件不存在,则创建写入新文件。
    wb	只能以二进制格式写入。如果文件存在覆盖该文件。如果该文件不存在,则创建写入新文件。
    w+	写入和读取模式。如果文件存在覆盖现有文件。如果该文件不存在,创建用于读写操作的新文件。
    wb+	用于以二进制格式写入和读出文件。如果文件存在覆盖现有文件。如果该文件不存在,创建用于读写操作的新文件。
    a	用于追加的文件。文件指针是在文件是否存在该文件的末尾。也就是说,该文件是在追加模式。如果该文件不存在,它会创建一个用于写入的新文件。
    ab	用于二进制格式追加。文件指针是在文件是否存在该文件的末尾。也就是说,文件是在追加模式。 如果该文件不存在,它会创建一个用于写入的新文件。
    a+	追加和读取方式。文件指针是在文件是否存在该文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建用于读写操作的新文件。
    ab+	附加和二进制格式读取模式。如果该文件存在文件指针在该文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建读写操作的新文件。

    二进制开发文件时不能加 encoding="utf-8"
"""

"""
读模式:
"""
# f = open("yesterday", 'r', encoding="utf-8") # 文件句柄
# data = f.read()
# print(data)

"""
写模式:创建新文件,覆盖原文件
"""
# f = open("yesterday", 'w', encoding="utf-8")
# f.write("我爱北京天安门。。。。。。。。。。。。")


"""
追加模式:打开文件,在最后追加内容
"""
# f = open("yesterday", 'a', encoding="utf-8")
# f.write("\n我爱北京天安门。。。。。。。。。。。。")


#
"""
    需求:打印出yesterday的内容,但第十行使用"--------------"覆盖掉原内容
    
    
    Note:建议使用第二种方法
        readlines(): 将文件的整个内容加载到内存,如果文件太大会撑爆内存;
        而第二种是内存中只会保留一行,读一行删除一行
        
        
"""
f = open("yesterday", "r", encoding="utf-8")

# 第一种方法:
# for index, line in enumerate(f.readlines()):
#     if index == 9:
#         print("".center(30, "-"))
#         continue
#     print(line.strip())


# 第二种方法:
# count = 0
# for line in f:
#     if count == 9:
#         print("".center(30, "-"))
#         count += 1
#         continue
#     print(line.strip())
#     count += 1


"""
文件读取指针
"""
# print(f.tell()) # 文件读取的指针位置 字符
# f.seek(0) # 设置文件读取的指针位置
# print(f.seekable()) # 判断文件位置指针是否可以移动,tty等文件不能移动


# 文件常用方法:
print(f.encoding) # 文件编码
print(f.isatty()) # 是否是终端设备 比如打印机等

print(f.readable()) # 判断文件是否可读
print(f.writable()) # 判断文件是否可写

# 将数据强制写入文件中,具体用法及说明请看:progress_bar.py
# f.flush()

print(f.closed) # 判断文件是否被关闭


f1 = open("yesterday", "a", encoding="utf-8")

"""
    文件的截取:
        truncate(x):将文件内容截取x个字符,不指定则全部截取,返回截取字符数
"""
# print(f1.truncate(1002))


"""
    b 二进制:无需指定编码方式,写入时先转码为二进制
"""
f2 = open("yesterday2", "wb")
# f2.write("Hello World!".encode("utf-8"))

# 以二进制格式读取
f3 = open("yesterday", "rb")
# print(f3.readline())

f.close()
f1.close()
f2.close()
f3.close()


print("以上是文件的读取和新增,以下是文件的修改操作".center(80, "~"))

"""
    需求:
        将yesterday文件中的“昨日当我年少轻狂”修改为“之前,当我很小时。”

    文件的修改操作:
        1、第一种:可以将文件一行一行读取并写入新文件,并判断某一行是否要修改,若修改,则将修改后的内容写入新文件;需打开两个文件一个读一个写
        1、第二种:可以像vim一行,将文件全部加载到内存,修改完成后又写入进去,这个不建议使用,大文件会撑爆内存。
"""

# 第一种
file1 = open("yesterday", "r", encoding="utf-8")
file2 = open("yesterday8", "w", encoding="utf-8")

for line in file1:
    if "昨日当我年少轻狂" in line:
        line = line.replace("昨日当我年少轻狂", "之前,当我很小时。")
    file2.write(line)

file1.close()
file2.close()

# 第一种方式优化,实现传参数
# find_param = sys.argv[1]
# replace_param = sys.argv[2]
# print("参数1 %s, 参数2 %s" %(find_param, replace_param))
# file3 = open("yesterday", "r", encoding="utf-8")
# file4 = open("yesterday8", "w", encoding="utf-8")
#
# for line in file3:
#     if find_param in line:
#         line = line.replace(find_param, replace_param)
#     file4.write(line)
#
# file3.close()
# file4.close()





"""
    with:为了避免打开文件忘记关闭,可以通过管理上下文;
    语法:
        with open("yesterday") as f:
            ...
            
    当with代码块执行完,内部会自动关闭并释放文件资源。
    
    在Python2.7后,with支持对多个文件的上下文进行管理;
        语法:
            with open("yesterday") as f, open("yesterday") as f1:
                ...
            
"""

# 使用with同时管理多个文件,官方规范:一行不超过80个字符;
with open("yesterday", "r", encoding="utf-8") as f8, \
        open("yesterday", "r", encoding="utf-8") as f9:
    print(f8.readline())
    print(f9.readline())

  

flush详解:progress_bar.py

# Author:Allister.Liu
# !/usr/bin/env python

import sys, time


"""
    flush():强制将数据写入,如果不flush(),缓冲区达到一定量时,数据才会写入
    
    例如:
        以下进度条:sys.stdout.flush() 如果没有这个flush,#号会全部一起打印出来,并不是一个一个打印。
"""

for i in range(100):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.02)

  

字符编码与转码

  • .在python2默认编码是ASCII, python3里默认是unicode
  • unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
  • 在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

下图仅适用于Python2.x

(上图来源于金角大王)

 

posted @ 2018-01-13 22:46  Allister  阅读(569)  评论(0编辑  收藏  举报