1. ファイルの読み書き
1.1 ファイルの読み込み
(1) ファイルを開く
Python の組み込みopen()
関数を使用してファイル オブジェクトを開き、ファイル名と識別子を渡します。
>>> import os
>>> f = open('/Users/michael/test.txt', 'r')
識別子は'r'
読み取りを意味するため、ファイルを正常に開くことができました。
Python では、with
プログラム エラーを回避するために次のステートメントが導入されています。
with open('/path/to/file', 'r') as f:
print(f.read())
上記のコードは次と同等です。
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
(2) ファイル内容の読み込み
方法 | 効果 |
---|---|
読む() | ファイルの内容全体を一度に読み取る |
読み取り(サイズ) | 一度に最大で size バイトのコンテンツを読み取ります |
読み込まれた行() | 一度に 1 行ずつ読んでください |
読み取りライン() | 一度にすべてを読み取り、行ごとに返します |
(3) ファイルを閉じる
メソッドを呼び出してclose()
ファイルを閉じます。ファイル オブジェクトはオペレーティング システムのリソースを占有するため、使用後はファイルを閉じる必要があります。
>>> f.close()
(4) 他のエンコード形式ファイルの読み込み
画像やビデオなどのバイナリ ファイルを読み取るには、次の'rb'
モードでファイルを開くだけです。
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
非 UTF-8 エンコードされたテキスト ファイルを読み取るには、たとえば GBK エンコードされたファイルを読み取るためにopen()
関数にパラメータを渡す必要があります。encoding
>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'
1.2 ファイルの書き込み
を呼び出すにはopen()
、識別子を渡す'w'
か、'wb'
テキスト ファイルまたはバイナリ ファイルの書き込みを指示します。
>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()
write()
ファイルに書き込むために繰り返し呼び出すことができますが、f.close()
ファイルを閉じるために呼び出す必要があります。ファイルを書き込むとき、オペレーティング システムは多くの場合、データをすぐにディスクに書き込まず、メモリにキャッシュし、アイドル状態のときにゆっくりと書き込みます。close()
メソッドが呼び出された場合にのみ、オペレーティング システムはすべての未書き込みデータがディスクに書き込まれることを保証します。
したがって、通常は、引き続き次のwith
ステートメントを使用してファイルを書き込みます。
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
2. ファイルとディレクトリの操作
Python の組み込みos
モジュールは、オペレーティング システムが提供するインターフェイス関数を直接呼び出すことができます。
2.1 ディレクトリの操作
(1) ディレクトリを参照する
# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
(2) ディレクトリを作成する
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
(3) ディレクトリの削除
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
(4) パスの結合と分割
2 つのパスを 1 つに結合する場合は、文字列を直接記述するのではなく、os.path.join()
関数を使用します。
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
パスを分割する場合は文字列を直接分割せず、os.path.split()
関数を使用してください。
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
(5) 拡張機能を取得する
os.path.splitext()
ファイル拡張子を直接取得できます。
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
2.2 ファイル操作
(1) ファイル名の変更
# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
(2) ファイルの削除
# 删掉文件:
>>> os.remove('test.py')
(3) ファイルのコピーと移動
os
ファイルのコピーや移動の機能はモジュールには提供されていませんが、shutil
モジュールが提供する機能はモジュールを補足するものcopyfile()
と考えることができます。os
shutil.copy(src_file, target_path)
shutil.move(src_file, target_path)
import shutil
shutil.copy('/Users/michael/testdir1/file.txt', '/Users/michael/testdir2')
shutil.move('/Users/michael/testdir1/file.txt', '/Users/michael/testdir2')
3.JSON
異なるプログラミング言語間でオブジェクトを転送するには、オブジェクトを標準形式にシリアル化する必要があります。最も一般的なのは JSON にシリアル化することです。
JSON は文字列として表現されるため、すべての言語で読み取ることができ、ディスクに簡単に保存したり、ネットワーク経由で送信したりできます。JSON は標準形式であるだけでなく、XML よりも高速で、Web ページ上で直接読み取ることができるため、非常に便利です。
3.1 Python 辞書 -> JSON
Python の組み込みjson
モジュールは、Python オブジェクトから JSON 形式への非常に完全な変換を提供します。まず、Python オブジェクトを JSON に変換する方法を見てみましょう。
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'
dumps()
このメソッドは 1 を返しstr
、コンテンツは標準の JSON です。
dump()
メソッドは JSON を に直接書き込むことができますfile-like Object
。
3.2 JSON -> Python 辞書
JSON を Python オブジェクトに逆シリアル化するには、loads()
または対応するload()
メソッドを使用します。前者は JSON 文字列を逆シリアル化し、後者はそこfile-like Object
から逆シリアル化します。
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{
'age': 20, 'score': 88, 'name': 'Bob'}
3.3 Python クラス -> JSON
通常、オブジェクトを表すために を使用するため、オブジェクトを直接シリアル化すると、そのオブジェクトは JSON にシリアル化できるオブジェクトではないclass
ため、エラーが報告されます。Student
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('Bob', 20, 88)
print(json.dumps(s))
# 输出
Traceback (most recent call last):
...
TypeError: <__main__.Student object at 0x10603cc50> is not JSON serializable
ただし、dumps()
このメソッドは多数のオプションのパラメーターも提供しており、その中のオプションのパラメーターは、default
dumps()
オブジェクト インスタンスを渡すための変換関数と変換関数を提供することでシリアル化をサポートします。
簡略化した書き方は以下の通りです。
print(json.dumps(s, default=lambda obj: obj.__dict__))
通常のインスタンスには、インスタンス変数を格納するために使用される属性 ( one ) がclass
あるためです。__dict__
dict
3.4 JSON -> Python クラス
JSON をオブジェクト インスタンスに逆シリアル化する場合Student
、loads()
メソッドは最初にdict
オブジェクトを変換し、次にobject_hook
渡す関数がdict
それをStudent
インスタンスに変換します。
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>