Python 3--ファイル操作

7799 ワード

一.ファイルアクション:
(1)ファイルを開き、ファイルハンドルを取得し、変数に値を割り当てる
(2)ハンドルによるファイル操作
(3)ファイルを閉じる
1.ファイルopenを開く(ファイルが存在する場合はファイルを開き、ファイルが存在しない場合はファイルを作成する)
path = 'test.txt'                        #      py        
path = r'/home/pyvip/py_case/text.txt'	 #      py        (                    )

file = open(path, 'r')			#        r   
file.read()				#             

ファイルを開くモードは、r、読み取り専用モード(デフォルト)です.w、書き込みモードのみ.【読み取り不可、存在しない場合作成、存在する場合削除内容】a,追加モード.【可読、存在しなければ作成、存在しなければコンテンツのみ追加】「+」は、あるファイルr+を同時に読み書きでき、読み書き可能なファイルを表す.【可読;書込み可能;追加可能】w+,書込みa+,同a“U”は、読出し時に、rrを自動的に(rまたはr+モードと併用)rUr+U“b”に変換することができることを示します.処理バイナリファイル(例えば、FTPはISOミラーファイルをアップロードし、linuxは無視できます.windowsはバイナリファイルを処理する際に表示する必要があります)rbwbab
2.ファイルf.write-ファイルの元の内容が上書きされます
file = open('test.txt','w')			#        w   ,          
file.write('      ')			#   
file.close()			    		#     ,       :      

3.ファイルの読み取りと閉じる
file.read()        #       
file.readline()    #     
file.readlines()   #          ,       
file.close()
#    open() ,  close()

前の5行を読みたいのですが、どうすればいいですか?1行1行のファイルをください.readline()ですか?
Absolutly No
簡単なforサイクルでできます~
f = open('test.txt','r')
for i in range(5):
    print(f.readline())

私は10行目を印刷したくないので、どうすればいいですか?
(この方法は効率が低い:一度にファイルを読み出し、再循環し、効率が低い;小さなファイルを読むことができ、大きなファイルを読むのに適していない)
f = open('test.txt','r')
for index,line in enumerate(f.readlines()):
    if index == 9:
        print('-----')
        continue
    print(line.strip())

私たちはこのようにすることができます~1行を取って1行読んで、メモリの中でも1行だけ保存して、効率が高いです
f = open('test.txt','r')
count  = 0
for line in f:
    if count == 9:
        print('-----')
        count += 1
        continue 
    print(line)
    count += 1

4.表示
file=open('test.txt','r')
file.tell()       #          (    )
file.readline()   #     
file.seek(0)      #             
file.seek(70)     #         70   ,

5.f.flush()--ファイルの内部バッファをリフレッシュし、受動的な出力待ちバッファではなく、内部バッファのデータをすぐにファイルに書き込む
import sys,time
for i in range(20):
    sys.stdout.write('###')
    sys.stdout.flush()#    flush,         ,          ,         
    time.sleep(0.1)
実行結果:プログレスバーのように、一つの#一の#を印刷し、20個を印刷する
6.f.truncate()--切断
ファイルの最初の行の先頭文字から切断され、切断されたファイルはsize文字で、sizeなしは現在の位置から切断されます.切断後、Vの後ろのすべての文字が削除され、Widnowsシステムの下の改行は2文字サイズを表します.
f =open('test.txt','a')
f.truncate(10)
f.close()
f =open('test.txt','r')
print(f.read())
#    :
Somehow, i   #   :Somehow, it seems the love I knew was always the most destructive kind

sizeなし:
f =open('test.txt','a')
f.seek(20)
f.truncate()
f.close()
f =open('test.txt','r')
print(f.read())
#    
Somehow, it seems th  #   :Somehow, it seems the love I knew was always the most destructive kind

シーケンス番号
方法及び説明
1
file.close()ファイルを閉じます.閉じるとファイルの読み書きはできません.
2
file.flush()ファイル内部バッファをリフレッシュし、出力バッファの書き込みを受動的に待つのではなく、内部バッファのデータをすぐにファイルに書き込む.
3
file.fileno()は、osモジュールのreadメソッドなどのいくつかの下位操作で使用できる整数のファイル記述子(file descriptor FD整数)を返します.
4
file.isatty()ファイルが端末装置に接続されている場合はTrueを返します.そうでない場合はFalseを返します.
5
file.next()はファイルの次の行を返します.
6
file.read([size])は、指定したバイト数をファイルから読み出し、指定されていないか負の場合はすべて読み出します.
7
file.readline([size])は、「」文字を含む行全体を読み出します.
8
file.readlines([sizeint])は、すべてのローを読み取り、リストを返します.sizeint>0が与えられた場合、合計がsizeintバイト程度のローを返します.実際の読み取り値はsizeintよりも大きい場合があります.バッファを埋め込む必要があるためです.
9
file.seek(offset[,whence])ファイルの現在位置を設定
10
file.tell()はファイルの現在の位置を返します.
11
file.truncate([size])はファイルの最初の行の先頭文字から切断され、切断ファイルはsize文字であり、sizeなしは現在の位置から切断されます.切断後、Vの後ろのすべての文字が削除され、Widnowsシステムの下の改行は2文字サイズを表します.
12
file.write(str)は文字列をファイルに書き込み、戻り値はありません.
13
file.writelines(sequence)はファイルにシーケンス文字列リストを書き込み、改行が必要な場合は各行の改行を自分で加えます.
二.コンテキスト管理with(with closeメソッドを実行する必要がなく、ファイルを自動的に閉じることができます)
with open('test.txt','r') as file:
    print(file.read())
#  :

from datetime import datetime


class RunTime(object):
    def __enter__(self):
        self.start_time = datetime.now()
        print(self.start_time)
        return self.start_time

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end_time = datetime.now()
        print(self.end_time)
        print('     : %s' % (self.end_time - self.start_time))


run = RunTime()
with run as a:
    for i in range(200):
        type('hello')
        
#     :
2018-04-18 01:47:34.042769
2018-04-18 01:47:34.043882
     : 0:00:00.001113
        
#                    
with    __enter__       as    
      with,      open()

三.IO流
導入:
ファイルは永続的に保存できますが、現在は一時的なファイルと似ています.一時的なQRコードのような永続的な記憶は必要ありません.これは永続的な記憶は必要ありませんが、短時間で大量に読み取る必要があります.この場合、ファイルに保存するしかありませんか.
1.stringIO:
IOアクションの作成:
import io
myio = io.StringIO()
myio.write('      ')
myio.getvalue()    #   
#        ,     

書き込み:
import io
myio = io.StringIO()
myio.write('      ')
myio.getvalue()
#        ,     

読み込み:
myio.getvalue()
StringIOは、ファイルを開くようにメモリ内で文字列を操作するため、ファイルの多くの方法もあります.
作成したStringIOがclose()メソッドを呼び出すと、メモリ内のデータが失われます.
2.BytesIO
オペレーションバイナリ
import io
my_byte_io = io.BytesIO()  #  
my_byte_io.write(b'hello') #  
print(my_byte_io.getvalue()) #  

BytesIOはStringIOと似ていますが、BytesIOはBytesデータを操作しています.
四.一般的なツール
1.OSオペレーティングシステムのインタラクション
  • ダイレクトコールシステムコマンド
  • import os
    os.system('ls')
    os.system('cat test.txt')
  • 汎用パスの動作
  • import os
    os.path
    os.path.join('pyvip','hch','hello') #     
    os.mkdir('py_case2')
    os.rename('py_case2','py_case_del') #    
  • ファイルディレクトリ操作:
  • import os
    os.mkdir('test')
    os.rename('test', 'test1')

    OSはPythonとオペレーティングシステムのインタラクション方式を提供しており、オペレーティングシステムに関連している限り、osモジュールで方法を探すことができます.
    2.shutil高級ファイル操作
    shutilモジュールでは、ファイルとファイルのセットに関する高度な操作が多数提供されています.
  • ファイルshutilを移動する.move
  • フォルダshutilをコピーする.copytree
  • フォルダshutilを削除する.rmtre

  • 練習1:
    コンテキストマネージャにより、IO操作とファイル操作の速度が速いと判断
    from datetime import datetime
    import io
    
    class RunTime(object):
        def __enter__(self):
            self.start_time = datetime.now()
            print(self.start_time)
            return self.start_time
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            self.end_time = datetime.now()
            print(self.end_time)
            print('     : %s' % (self.end_time - self.start_time))
    
    
    sio = io.StringIO()
    sio.write('      ')
    
    with RunTime() as a:
        with open('duqusucai.py', 'r') as file:
            print(file.read())
    
    with RunTime() as b:
            print(sio.getvalue())
    
    
    #     :
    2018-04-18 02:58:20.221762
          
    2018-04-18 02:58:20.228967
         : 0:00:00.007205
    2018-04-18 02:58:20.229365
          
    2018-04-18 02:58:20.229521
         : 0:00:00.000156