Skip to content

Commit 25da575

Browse files
authored
Update 7.-input-and-output.md
1 parent 7251ea2 commit 25da575

File tree

1 file changed

+23
-27
lines changed

1 file changed

+23
-27
lines changed

7.-input-and-output.md

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Về cơ bản, cách sử dụng của hàm [`str.format()`](https://docs.pytho
9292
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
9393
We are the knights who say "Ni!"
9494
```
95-
Dầu ngặc {} và ký tự ở bên trong dấu ngoặc được thay thế bằng các tham số được truyền vào trong hàm [`str.format()`](https://docs.python.org/3/library/stdtypes.html#str.format). Phần số ở trong dấu {} được sử dụng để chỉ ra vị trí in ra của tham số được truyền vào trong hàm [`str.format()`](https://docs.python.org/3/library/stdtypes.html#str.format).>>>
95+
Dầu ngặc {} và ký tự ở bên trong dấu ngoặc được thay thế bằng tham số được truyền vào trong hàm [`str.format()`](https://docs.python.org/3/library/stdtypes.html#str.format). Phần số ở trong dấu {} được sử dụng để chỉ ra vị trí in ra của tham số được truyền vào trong hàm [`str.format()`](https://docs.python.org/3/library/stdtypes.html#str.format).>>>
9696

9797
```text
9898
>>> print('{0} and {1}'.format('spam', 'eggs'))
@@ -145,7 +145,7 @@ Jack ==> 4098
145145
Dcab ==> 7678
146146
Sjoerd ==> 4127
147147
```
148-
Nếu có 1 chuỗi rất dài, mà không muốn chia chuỗi, có thể in các biến theo tên thay vì vị trí. Để làm điều đó, đưa vào 1 từ điển và sử dụng dấu ngoặc `'[]'` để truy cập các khóa của từ điển>>>
148+
Nếu có 1 chuỗi rất dài, mà không muốn chia chuỗi, có thể in các biến theo tên thay vì vị trí. Để làm điều đó, đưa vào 1 từ điển và sử dụng dấu ngoặc `'[]'` để truy cập các giá trị thông qua các khóa (key) của từ điển>>>
149149

150150
```text
151151
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
@@ -154,7 +154,7 @@ Nếu có 1 chuỗi rất dài, mà không muốn chia chuỗi, có thể in cá
154154
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
155155
```
156156

157-
Có thể đưa table là một tham số và thêm 2 dấu ‘\*\*’ ở đầu.>>>
157+
Có thể đưa biến table ở trên là một tham số và thêm 2 dấu ‘\*\*’ ở đầu.>>>
158158

159159
```text
160160
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
@@ -187,21 +187,21 @@ Hàm [`open()`](https://docs.python.org/3/library/functions.html#open) trả v
187187

188188
Tham số đầu tiên của hàm `open()` là một chuỗi bao gồm tên file. Tham số thứ 2 là một chuỗi bao gồm một vài ký tự để miêu tả cách sử dụng của file đó, gọi là _mode_. Nếu _mode_`'r'`, file đó chỉ được đọc. Nếu _mode_`'w'`, file đó chỉ được ghi \(Nếu tồn tại 1 file có cùng tên, file cùng tên đó sẽ bị xóa đi khi sử dụng _mode_`'w'`\). Nếu _mode_`'a'` mở file để ghi thêm vào, trong trường hợp này, bất kỳ dữ liệu nào được thêm vào sẽ được tự động ghi ở cuối file. Nếu _mode_`'r+'`, mở file để vừa ghi vừa đọc. Tham số _mode_ là tùy chọn, trong trường hợp không khai báo _mode_, mặc định là `'r'`.
189189

190-
Thông thường, tệp được mở ở _text mode_, có nghĩa là, đọc là ghi chuỗi từ 1 file sang 1 file khác, chuỗi đó được mã hóa bằng một dạng mã hóa cụ thể. Nếu mã hóa không được chỉ định, kiểu mã hóa mặc định cho chuỗi trên phụ thuộc vào nền tảng \(xem hàm [`open()`](https://docs.python.org/3/library/functions.html#open)\). Sử dụng _mode_`'b'` khi mở file binary, trong trường hợp này, dữ liệu được đọc ghi dưới dạng đối tượng byte. Mode này được sử dụng khi tất cả các file không bao gồm ký tự văn bản (text).
190+
Thông thường, tệp được mở ở chế độ văn bản (_text mode_), có nghĩa là, đọc là ghi chuỗi từ 1 file sang 1 file khác, chuỗi đó được mã hóa bằng một dạng mã hóa cụ thể. Nếu mã hóa không được chỉ định, kiểu mã hóa mặc định cho chuỗi trên phụ thuộc vào nền tảng \(xem hàm [`open()`](https://docs.python.org/3/library/functions.html#open)\). Sử dụng _mode_`'b'` khi mở file binary, trong trường hợp này, dữ liệu được đọc ghi dưới dạng đối tượng byte. Mode này được sử dụng khi tất cả các file không bao gồm ký tự văn bản (text).
191191

192-
Ở chế độ văn bản (text mode), khi đọc file, `\n` mặc định được chuyển đổi phụ thuộc vào nền tảng cụ thể \(`\n` cho Unix, `\r\n` cho Windows\). Khi ghi file, `\n` mặc định được chuyển đổi trở lại phụ thuộc vào nền tảng. Việc chuyển đổi ngầm này rất có lợi đối với file văn bản, nhưng nó sẽ làm hỏng dữ liệu nhị phân giống như file `JPEG` hoặc file `EXE`. Vì vậy, hãy cẩn thận khi sử dụng chế độ nhị phân (binary mode) khi đọc và ghi file.
192+
Ở chế độ văn bản (_text mode_), khi đọc file, `\n` mặc định được chuyển đổi phụ thuộc vào nền tảng cụ thể \(`\n` cho Unix, `\r\n` cho Windows\). Khi ghi file, `\n` mặc định được chuyển đổi trở lại phụ thuộc vào nền tảng. Việc chuyển đổi ngầm này rất có lợi đối với file văn bản, nhưng nó sẽ làm hỏng dữ liệu nhị phân giống như file `JPEG` hoặc file `EXE`. Vì vậy, hãy cẩn thận khi sử dụng chế độ nhị phân (binary mode) khi đọc và ghi file.
193193

194-
Sử dụng từ khóa [`with`](https://docs.python.org/3/reference/compound_stmts.html#with) với đối tượng file. Ưu điểm là đóng file ngay sau khi kết thúc phiên làm việc, thậm chí các lỗi ngoại lệ (exception) có thể được chỉ ra khi sử dụng [`with`](https://docs.python.org/3/reference/compound_stmts.html#with). Thêm vào đó, sử dụng [`with`](https://docs.python.org/3/reference/compound_stmts.html#with) cũng ngắn gọn hơn với cách viết [`try`](https://docs.python.org/3/reference/compound_stmts.html#try)-[`finally`](https://docs.python.org/3/reference/compound_stmts.html#finally):>>>
194+
Sử dụng từ khóa [`with`](https://docs.python.org/3/reference/compound_stmts.html#with) với đối tượng file. Ưu điểm là đóng file ngay sau khi kết thúc phiên làm việc, thậm chí các lỗi ngoại lệ (exception) có thể được xuất ra khi sử dụng [`with`](https://docs.python.org/3/reference/compound_stmts.html#with). Thêm vào đó, sử dụng [`with`](https://docs.python.org/3/reference/compound_stmts.html#with) cũng ngắn gọn hơn với cách viết [`try`](https://docs.python.org/3/reference/compound_stmts.html#try)-[`finally`](https://docs.python.org/3/reference/compound_stmts.html#finally):>>>
195195

196196
```text
197197
>>> with open('workfile') as f:
198198
... read_data = f.read()
199199
>>> f.closed
200200
True
201201
```
202-
Nếu không sử dụng từ khóa [`with`](https://docs.python.org/3/reference/compound_stmts.html#with), phải gọi hàm `f.close()` để đóng file và giải phóng tài nguyên hệ thống đã được sử dụng. Nếu không đóng file, file này vẫn để mở cho tới khi trình thu gom rác (garbage collector) của Python hủy đối tượng và đóng file. Một rủi ro khác là, thời điểm dọn dẹp của trình thu gom rác phụ thuộc vào các phiên bản python khác nhau.
202+
Nếu không sử dụng từ khóa [`with`](https://docs.python.org/3/reference/compound_stmts.html#with), phải gọi hàm `f.close()` để đóng file và giải phóng tài nguyên hệ thống đã được sử dụng. Nếu không đóng file, file này vẫn để mở cho tới khi trình thu gom rác (_garbage collector_) của Python hủy đối tượng và đóng file. Một rủi ro khác là, thời điểm dọn dẹp của trình thu gom rác phụ thuộc vào các phiên bản python khác nhau.
203203

204-
Lưu ý, một khi đối tượng file được đóng, khi sử dụng hoặc là câu lệnh [`with`](https://docs.python.org/3/reference/compound_stmts.html#with) hoặc đã gọi hàm `f.close()`, sẽ không thể thao tác trên đối tượng file đó nữa.>>>
204+
Lưu ý, một khi đối tượng file được đóng, bằng câu lệnh [`with`](https://docs.python.org/3/reference/compound_stmts.html#with) hoặc đã gọi hàm `f.close()`, chúng ta sẽ không thể thao tác trên đối tượng file đó nữa.>>>
205205

206206
```text
207207
>>> f.close()
@@ -215,7 +215,7 @@ ValueError: I/O operation on closed file
215215

216216
Các ví dụ còn lại trong phần này giả định rằng một đối tượng file gọi là `f` đã được tạo ra.
217217

218-
Để đọc nội dung 1 file, gọi hàm `f.read(size)`, hàm này đọc một lượng dữ liệu chỉ ra ở biến _size_ và trả về 1 chuỗi \(ở chế độ text\) or đối tượng byte \(ở chế độ nhị phân)._size_ là một tham số kiểu số tùy chọn. Khi _size_ được bỏ qua hoặc là số âm, toàn bộ nội dung file sẽ được đọc và được trả về trong 1 chuỗi; Sẽ là vấn đề nếu file lớn gấp đôi dung lượng bộ nhớ của máy. trường hợp trên, số lượng dữ liệu tối đa có thể đọc và được trả về. Khi đọc tới cuối file, hàm `f.read()` trả về một chuỗi rỗng \(`''`\).>>>
218+
Để đọc nội dung 1 file, gọi hàm `f.read(size)`, hàm này đọc một lượng dữ liệu chỉ ra ở biến _size_ và trả về 1 chuỗi \(ở chế độ text\) hoặc đối tượng byte \(ở chế độ nhị phân). _size_ là một tham số kiểu số tùy chọn. Khi _size_ được bỏ qua hoặc là số âm, toàn bộ nội dung file sẽ được đọc và được trả về trong 1 chuỗi; Sẽ là vấn đề nếu file lớn gấp đôi dung lượng bộ nhớ của máy. Trong trường hợp này, hàm `f.read(size)` đọc lượng dữ liệu tối đa có thể đọc và trả về 1 chuỗi. Khi đọc tới cuối file, hàm `f.read()` trả về một chuỗi rỗng \(`''`\).>>>
219219

220220
```text
221221
>>> f.read()
@@ -233,7 +233,7 @@ Hàm `f.readline()` đọc từng dòng trong file; Ký tự xuống dòng \(`\n
233233
>>> f.readline()
234234
''
235235
```
236-
Vì đọc các dòng trong file, nên có thể dùng vòng lặp trên đối tượng file. Đây là một cách đơn giản và hiệu quả để đọc từng dòng của file.>>>
236+
thể dùng vòng lặp trên đối tượng file. Đây là một cách đơn giản và hiệu quả để đọc từng dòng của file.>>>
237237

238238
```text
239239
>>> for line in f:
@@ -258,7 +258,7 @@ Những kiểu đối tượng khác cần phải được chuyển đổi - ho
258258
18
259259
```
260260
Hàm `f.tell()` trả về một số nguyên, số nguyên này định vị trí hiện tại của đối tượng file trong file hiển thị số lượng byte từ đầu file khi ở chế độ nhị phân (binary mode) và một số opaque number ở chế độ văn bản (text mode)
261-
Để thay đổi vị trí của đối tượng file, sử dụng hàm `f.seek(offset, from_what)`. Vị trí được tính toán dựa trên tham số _offset_; điểm tham chiếu được lựa chọn dựa vào tham số _from\_what_. N _from\_what_ là 0, vị trí tham chiếu từ đầu file, _from\_what_ là 1, ví trí tham chiếu là vị trí file hiện tại. _from\_what_ là 2, vị trí tham chiếu là vị trí cuối của tệp.>>>
261+
Để thay đổi vị trí của đối tượng file, sử dụng hàm `f.seek(offset, from_what)`. Vị trí được tính toán dựa trên tham số _offset_; điểm tham chiếu được lựa chọn dựa vào tham số _from\_what_. Nếu _from\_what_ là 0, vị trí tham chiếu từ đầu file, _from\_what_ là 1, ví trí tham chiếu là vị trí file hiện tại. _from\_what_ là 2, vị trí tham chiếu là vị trí cuối của tệp.>>>
262262

263263
```text
264264
>>> f = open('workfile', 'rb+')
@@ -275,43 +275,39 @@ b'd'
275275
```
276276
In text files \(those opened without a `b` in the mode string\), only seeks relative to the beginning of the file are allowed \(the exception being seeking to the very file end with `seek(0, 2)`\) and the only valid _offset_ values are those returned from the `f.tell()`, or zero. Any other _offset_ value produces undefined behaviour.
277277

278-
File objects have some additional methods, such as `isatty()` and `truncate()` which are less frequently used; consult the Library Reference for a complete guide to file objects.
278+
Đối tượng file (_file object_) có một thêm một số phương thức như là hàm `isatty()` `truncate()`, tuy nhiên chúng ít khi được sử dụng, bạn có thể tham khảo trong thư viện để xem hướng dẫn đầy đủ về đối tượng file.
279279

280-
#### 7.2.2. Saving structured data with [`json`](https://docs.python.org/3/library/json.html#module-json)
280+
#### 7.2.2. Lưu trữ dữ liệu có cấu trúc với [`json`](https://docs.python.org/3/library/json.html#module-json)
281281

282-
Strings can easily be written to and read from a file. Numbers take a bit more effort, since the `read()` method only returns strings, which will have to be passed to a function like [`int()`](https://docs.python.org/3/library/functions.html#int), which takes a string like `'123'` and returns its numeric value 123. When you want to save more complex data types like nested lists and dictionaries, parsing and serializing by hand becomes complicated.
282+
Các chuỗi có thể dễ dàng được đọc hoặc ghi vào 1 file. Đối với dữ liệu số, cần phải mất công thêm một chút, bởi vì hàm `read()` chỉ trả về chuỗi, vì vậy, cần phải sử dụng hàm [`int()`](https://docs.python.org/3/library/functions.html#int) để chuyển đổi 1 chuỗi như `'123'` thành 1 số với giá trị bằng 123. Tuy nhiên, khi phải lưu trữ các kiểu dữ liệu phức tạp như danh sách lồng nhau (_nested lists_) và từ điển (_dictionaries_), việc phân tích cú pháp và tuần tự hóa bằng tay rất phức tạp.
283283

284-
Rather than having users constantly writing and debugging code to save complicated data types to files, Python allows you to use the popular data interchange format called [JSON \(JavaScript Object Notation\)](http://json.org/). The standard module called [`json`](https://docs.python.org/3/library/json.html#module-json) can take Python data hierarchies, and convert them to string representations; this process is called _serializing_. Reconstructing the data from the string representation is called _deserializing_. Between serializing and deserializing, the string representing the object may have been stored in a file or data, or sent over a network connection to some distant machine.
284+
Thay vì yêu cầu người dùng viết code và debugging để ghi những kiểu dữ liệu phức tạp vào file, Python cho phép sử dụng định dạng trao đổi dữ liệu phổ biến hiện nay gọi là [JSON \(JavaScript Object Notation\)](http://json.org/). Định dạng [`json`] có thể lưu trữ dữ liệu phân cấp (_data hierarchies_) của python, và chuyển các dữ liệu về dạng chuỗi; quá trình này được gọi là tuần tự hóa (_serializing_). Quá trình ngược lại, tái tạo dữ liệu từ biểu diễn chuỗi được gọi là giải tuần tự hóa ( _deserializing_). Giữa tuần tự hóa và giải tuần tự hóa, chuỗi đại diện cho đối tượng được lưu trữ trong 1 file hoặc một dữ liệu, hoặc được truyền qua kết nối mạng tới một số máy ở xa.
285285

286-
Note
286+
Lưu ý:
287287

288-
The JSON format is commonly used by modern applications to allow for data exchange. Many programmers are already familiar with it, which makes it a good choice for interoperability.
288+
Định dạng JSON thường được các ứng dụng hiện đại sử dụng cho mục đích trao đổi dữ liệu. Nhiều lập trình viên đã quen thuộc với nó, nên JSON là một lựa chọn tốt cho việc tương tác.
289289

290-
If you have an object `x`, you can view its JSON string representation with a simple line of code:>>>
290+
Nếu có 1 đối tượng `x`, có thể xem biểu biểu diễn chuỗi JSON của đối tượng `x` chỉ với 1 dòng code đơn giản như sau:>>>
291291

292292
```text
293293
>>> import json
294294
>>> json.dumps([1, 'simple', 'list'])
295295
'[1, "simple", "list"]'
296296
```
297-
298-
Another variant of the [`dumps()`](https://docs.python.org/3/library/json.html#json.dumps) function, called [`dump()`](https://docs.python.org/3/library/json.html#json.dump), simply serializes the object to a [text file](https://docs.python.org/3/glossary.html#term-text-file). So if `f` is a [text file](https://docs.python.org/3/glossary.html#term-text-file) object opened for writing, we can do this:
297+
Một biến thể khác của hàm [`dumps()`](https://docs.python.org/3/library/json.html#json.dumps), là [`dump()`](https://docs.python.org/3/library/json.html#json.dump), hàm này tuần tự hóa đối tượng thành một file văn bản \([text file](https://docs.python.org/3/glossary.html#term-text-file)). Vì vậy, nếu `f` là một đối tượng file văn bản \([text file](https://docs.python.org/3/glossary.html#term-text-file) object), được mở để ghi dữ liệu, ta có thể làm như sau:
299298

300299
```text
301300
json.dump(x, f)
302301
```
303302

304-
To decode the object again, if `f` is a [text file](https://docs.python.org/3/glossary.html#term-text-file) object which has been opened for reading:
303+
Để giải mã đối tượng một lần nữa, nếu `f` là một đối tượng file văn bản ([text file](https://docs.python.org/3/glossary.html#term-text-file) object), được mở ra để đọc, ta có thể làm như sau:
305304

306305
```text
307306
x = json.load(f)
308307
```
309308

310-
This simple serialization technique can handle lists and dictionaries, but serializing arbitrary class instances in JSON requires a bit of extra effort. The reference for the [`json`](https://docs.python.org/3/library/json.html#module-json) module contains an explanation of this.
311-
312-
See also
313-
314-
[`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle) - the pickle module
309+
Kỹ thuật tuần tự hóa đơn giản này có thể xử lý cho các kiểu dữ liệu danh sách (_list_) và từ điển (_dict_), nhưng tuần tự hóa đối tượng của 1 lớp cần thêm một số xử lý khác. Bạn có thể tham khảo trong [`json`](https://docs.python.org/3/library/json.html#module-json) về vấn đề này.
315310

316-
Contrary to [JSON](https://docs.python.org/3/tutorial/inputoutput.html#tut-json), _pickle_ is a protocol which allows the serialization of arbitrarily complex Python objects. As such, it is specific to Python and cannot be used to communicate with applications written in other languages. It is also insecure by default: deserializing pickle data coming from an untrusted source can execute arbitrary code, if the data was crafted by a skilled attacker.
311+
Xem thêm: [`pickle`](https://docs.python.org/3/library/pickle.html#module-pickle) - the pickle module
317312

313+
Không như [JSON](https://docs.python.org/3/tutorial/inputoutput.html#tut-json), _pickle_ là một giao thức cho phép tuần tự hóa những đối tượng phức tạp. Vì vậy, nó là đặc trưng của python và không thể giao tiếp với các ứng dụng được viết bằng các ngôn ngữ lập trình khác. Mặc định, nó cũng không an toàn: giải tuần tự hóa (_deserializing_) dữ liệu từ 1 nguồn không đáng tin có thể thực hiện mã tùy ý nếu dữ liệu được tạo bởi kẻ tấn công.

0 commit comments

Comments
 (0)