***

11836 ワード

本稿では,異なる応用シーンとその解決策について,PythonにおけるファイルとIOに関するいくつかの知識をまとめた.
1.読み書きテキストデータアプリケーションシーン:ASCII、UTF-8、UTF-16などの異なる符号化テキストデータを読み取る必要がある解決策:rtモードのopen()関数を使用する
#      
#1 single string 
with open('somefile.txt') as f:
    data=f.read

#2      
with open('somefile.txt','rt') as f:
    for line in f:
        print(line)
#3         
with open('somefile.txt','wt') as f:
    print(line1,file=f)
    print(line2,file=f)

#      
with open('somefile.txt','rt',encoding='utf-8') as f:
    for line in f:
        print(line)

2.読み書きバイトデータ適用シーン:画像、音声ファイルなどのバイナリファイルを読み込む必要があるソリューション:rb、wbモードのopen()関数を使用する
  1
with open('somefile.bin','rb') as f:
    data=f.read(16)
    text=data.decode('utf-8')

with open('somefile.bin','wb') as f:
    text='helloword'
    f.write(text.encode('utf-8'))
  2    c       
import array
nums=array.array('i',[1,2,3,4])
with open('data.bin','wb') as f:
    f.write(nums)

3.読み書き圧縮ファイル適用シーン:gzipまたはbz 2形式の圧縮ファイルソリューションを読み書きする:gzipおよびbz 2モジュールのopen()関数を使用する
 :
import gzip
with gzip.open('somefile.gz','rt') as f:
    text=f.read()

import bz2
with bz2.open('somefile.bz2','rt') as f:
    text=f.read()
 :
import gzip
with gzip.open('somefile.gz','wt') as f:
    f.write(text)

import bz2
with bz2.open('somefile.bz2','wt') as f:
    f.write(text)

4.可変バッファ適用シーンへのバイナリデータの読み出し:中間レプリケーション処理を行うことなく、1つのバッファにバイナリデータを直接読み出す必要があるソリューション:ファイルオブジェクトを使用するreadinto()メソッド
  
import os.path
def read_into_buffer(filename):
    buf=bytearray(os.path.getsize(filename))
    with open(filename,'rb') as f:
        f.readinto(buf)
    return buf

#test case
with open('sample.bin','wb') as f:
    f.write(b'helloworld')
buf=read_into_buffer('sample.bin')
buf
buf[0:5]=b'hahah'
buf
with open('newsample.bin','wb') as f:
    f.write(buf)

5.ファイル名の操作アプリケーションシーン:パス名を使用してファイル名、ディレクトリ名、絶対パスなどの解決策を取得する必要がある:osを使用する.pathモジュールの関数はパス名を操作します
  
import os 
path='/home/dw/ls-output.txt'
os.path.basename(path)
os.path.dirname(path)
os.path.join('tmp','data',os.path.basename(path))
path='~/ls-output.txt'
os.path.expanduser(path)
os.path.splitext(path)

6.オープンファイルのエンコードアプリケーションシーンを追加または変更する:オープンファイルを1つ閉じずにUnicodeエンコードソリューションを追加または変更したい:ioを使用する.TextIOWrapper()オブジェクトパッケージ
  
import urllib.request
import io
u=urllib.reques.urlopen('http://www.python.ory')
f=io.TextIOWrapper(u,encoding='utf-8')
text=f.read()

import sys
sys.stdout.encoding
#detach           ,          
sys.stdout=io.TextIOWrapper(sys.stdout.detach(),encoding='latin-1')
sys.stdout.encoding

7.テンポラリファイルまたはフォルダアプリケーションシーンの作成:プログラム実行時にテンポラリファイルまたはディレクトリを作成し、使用後にソリューションを自動的に破棄する必要がある:tempfile.TemporaryFile
  1       
from tempfile import TemporaryFile
#     w+t,      w+b
with TemporaryFile('w+t') as f:
    f.write('helloworl
'
) f.write('testing
'
) # f.seek(0) data=f.read() #
  2      
from tempfile import TemporaryDirectory
with TemporaryDirectory() as dirname:
    print('dirname is :',dirname)
    #             
#             

8.シーケンス化Pythonオブジェクトアプリケーションシーン:1つのPythonオブジェクトを1バイトストリームにシーケンス化してファイルに保存したり、データベースに保存したり、ネットワークを介して転送したりする必要があります.pickleモジュールを使用します.
  1
import pickle
data=...
f=open('somefile','wb')
pickle.dump(data,f)
#           
s=pickle.dumps(data)
#           
f=open('somefile','rb')
data=pickle.load(f)
data=pickle.load(s)
  2
class Countdown:
    def __init__(self,n):
        self.n=n
        self.thr=threading.Thread(target=self.run)
        self.thr.daemon=True
        self.thr.start()
    def run(self):
        while self.n>0:
            print('t-minus',self.n)
            self.n -=1
            time.sleep(5)
    def __getstate__(self):
        return self.n
    def __getstate__(self,n):
        self.__init__(n)
#test case
import countdown
c=countdown.Countdown(30)
t-minus 30

f=open('cstate.p','wb')
import pickle
pickle.dump(c,f)
f.close()
#  python          
f=open('cstate.p','rb')
pickle.load(f)