You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 7.-input-and-output.md
+23-27Lines changed: 23 additions & 27 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -92,7 +92,7 @@ Về cơ bản, cách sử dụng của hàm [`str.format()`](https://docs.pytho
92
92
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
93
93
We are the knights who say "Ni!"
94
94
```
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).>>>
96
96
97
97
```text
98
98
>>> print('{0} and {1}'.format('spam', 'eggs'))
@@ -145,7 +145,7 @@ Jack ==> 4098
145
145
Dcab ==> 7678
146
146
Sjoerd ==> 4127
147
147
```
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>>>
@@ -187,21 +187,21 @@ Hàm [`open()`](https://docs.python.org/3/library/functions.html#open) trả v
187
187
188
188
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_ là `'r'`, file đó chỉ được đọc. Nếu _mode_ là `'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_ là `'w'`\). Nếu _mode_ là `'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_ là `'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'`.
189
189
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_ là `'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_ là `'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).
191
191
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.
193
193
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):>>>
195
195
196
196
```text
197
197
>>> with open('workfile') as f:
198
198
... read_data = f.read()
199
199
>>> f.closed
200
200
True
201
201
```
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.
203
203
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 là đã 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.>>>
205
205
206
206
```text
207
207
>>> f.close()
@@ -215,7 +215,7 @@ ValueError: I/O operation on closed file
215
215
216
216
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.
217
217
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ố và 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 \(`''`\).>>>
219
219
220
220
```text
221
221
>>> f.read()
@@ -233,7 +233,7 @@ Hàm `f.readline()` đọc từng dòng trong file; Ký tự xuống dòng \(`\n
233
233
>>> f.readline()
234
234
''
235
235
```
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
+
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.>>>
237
237
238
238
```text
239
239
>>> 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
258
258
18
259
259
```
260
260
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.>>>
262
262
263
263
```text
264
264
>>> f = open('workfile', 'rb+')
@@ -275,43 +275,39 @@ b'd'
275
275
```
276
276
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.
277
277
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()`và`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.
279
279
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)
281
281
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.
283
283
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.
285
285
286
-
Note
286
+
Lưu ý:
287
287
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.
289
289
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:>>>
291
291
292
292
```text
293
293
>>> import json
294
294
>>> json.dumps([1, 'simple', 'list'])
295
295
'[1, "simple", "list"]'
296
296
```
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:
299
298
300
299
```text
301
300
json.dump(x, f)
302
301
```
303
302
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:
305
304
306
305
```text
307
306
x = json.load(f)
308
307
```
309
308
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.
315
310
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
317
312
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