Hướng dẫn unable to read file in python - không thể đọc tệp trong python

Tôi hoàn toàn mới đối với Python. Tôi đã cố gắng đọc một tệp mà tôi đã tạo nhưng nhận được lỗi dưới đây

File "C:/Python25/Test scripts/Readfile.py", line 1, in 
    filename = open['C:\Python25\Test scripts\newfile','r']
IOError: [Errno 2] No such file or directory: 'C:\\Python25\\Test scripts\newfile

Mã của tôi:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]

Ngoài ra tôi đã thử

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]

Nhưng cùng một lỗi tôi đang nhận được.

Đã hỏi ngày 2 tháng 11 năm 2014 lúc 21:21Nov 2, 2014 at 21:21

2

Try:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]

Đầu tiên bạn xác nhận tập tin đó, nó tồn tại. Sau đó, bạn mở nó. Với trình bao bọc hữu ích hơn, nó đóng tệp của bạn, sau khi bạn đọc xong. Vì vậy, bạn sẽ không bị mắc kẹt với nhiều mô tả mở.

Đã trả lời ngày 2 tháng 11 năm 2014 lúc 21:26Nov 2, 2014 at 21:26

BeriberiBeri

11.2k4 Huy hiệu vàng32 Huy hiệu bạc55 Huy hiệu Đồng4 gold badges32 silver badges55 bronze badges

Tôi nghĩ rằng có lẽ bạn đang gặp vấn đề này vì bạn không bao gồm toàn bộ tên tệp.

Bạn nên thử:

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]

*Ngoài ra, nếu bạn đang chạy tệp Python này ở cùng một vị trí với tệp đích mà bạn đang mở, bạn không cần phải cung cấp đầy đủ thư mục, bạn chỉ có thể gọi:

filename = open[newfile.txt

Đã trả lời ngày 2 tháng 11 năm 2014 lúc 21:55Nov 2, 2014 at 21:55

ChrisdemeKechRisdemekechrisdemeke

1631 Huy hiệu vàng2 Huy hiệu bạc9 Huy hiệu đồng1 gold badge2 silver badges9 bronze badges

Tôi đã từng gặp vấn đề tương tự. Đây là cách tôi hiểu đúng.

ma cua ban:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]

Thử cái này:

with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]

Hy vọng nó giúp.

Đã trả lời ngày 7 tháng 9 năm 2018 lúc 3:49Sep 7, 2018 at 3:49

Tôi đang sử dụng mã vs. Nếu tôi không sử dụng Dent, nó sẽ không hoạt động cho dòng in. Vì vậy, hãy cố gắng để có định dạng ngay sau đó bạn sẽ thấy phép thuật.

with open["mytest.txt"] as myfile:
    print[myfile.read[]]

hoặc không có định dạng như thế này:

hellofile=open['mytest.txt', 'r']
print[hellofile.read[]]

Đã trả lời ngày 6 tháng 4 năm 2020 lúc 19:13Apr 6, 2020 at 19:13

0

Mô hình cơ bản của việc mở và đọc các tệp trong Python

Đây là tài liệu Python chính thức về đọc và viết từ các tập tin. Nhưng trước khi đọc nó, chúng ta hãy đi sâu vào mức tối thiểu mà tôi muốn bạn biết.

Hãy đi thẳng đến một ví dụ về mã. Giả vờ bạn có một tệp có tên là ví dụ.txt trong thư mục hiện tại. Nếu bạn không, chỉ cần tạo một cái, sau đó điền vào các dòng này và lưu nó:example.txt in the current directory. If you don't, just create one, and then fill it with these lines and save it:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
0

Dưới đây là một đoạn ngắn của mã Python để mở tệp đó và in nội dung của nó lên màn hình - lưu ý rằng mã Python này phải được chạy trong cùng thư mục mà tệp

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
1 tồn tại.

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
1

Điều đó có vẻ quá phức tạp? Đây là phiên bản ít dài dòng hơn:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
2

Dưới đây là cách đọc tệp đó, từng dòng, sử dụng vòng lặp:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
3

.FileNotFoundError already – that's almost to be expected. Keep reading!]

Vẫn có vẻ quá phức tạp? Chà, không có gì xung quanh thực tế là ở lớp lập trình, việc mở một tệp khác biệt với việc đọc nội dung của nó. Không chỉ vậy, chúng tôi cũng phải đóng tệp theo cách thủ công.opening a file is distinct from reading its contents. Not only that, we also have to manually close the file.

Bây giờ chúng ta hãy thực hiện từng bước này.

Cách mở tệp - một cuộc thăm dò tương tác

Để mở một tệp, chúng tôi chỉ cần sử dụng phương thức

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
2 và chuyển vào, làm đối số đầu tiên, tên tệp:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
4

Điều đó có vẻ đủ dễ dàng, vì vậy hãy nhảy vào một số lỗi phổ biến.

Cách làm rối khi mở tệp

Đây có thể là lỗi phổ biến nhất mà bạn sẽ gặp phải khi cố gắng mở tệp.

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
5

Trên thực tế, tôi đã thấy học sinh lãng phí hàng chục giờ để cố gắng vượt qua thông báo lỗi này, bởi vì họ không dừng lại để đọc nó. Vì vậy, đọc nó:

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
3 có nghĩa là gì?read it: What does
filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
3 mean?

Hãy thử đặt không gian nơi việc viết hoa xảy ra:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
6

Bạn sẽ gặp lỗi này vì bạn đã cố gắng mở một tệp mà đơn giản là không tồn tại. Đôi khi, đó là một lỗi đánh máy đơn giản, cố gắng

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
2 một tập tin có tên
filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
5 nhưng vô tình đánh vần nó là
filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
6.

Nhưng thường xuyên hơn, đó là bởi vì bạn biết một tệp tồn tại dưới một tên tệp nhất định, chẳng hạn như

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
5 - nhưng làm thế nào để mã Python của bạn biết tệp đó ở đâu? Đây có phải là
filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
5 tồn tại trong thư mục tải xuống của bạn không? Hoặc một trong đó có thể tồn tại trong thư mục tài liệu của bạn? Hoặc hàng ngàn thư mục khác trên hệ thống máy tính của bạn?Downloads folder? Or the one that might exist in your Documents folder? Or the thousands of other folders on your computer system?

Đó là một câu hỏi khá phức tạp. Nhưng bước đầu tiên không lãng phí thời gian của bạn là nếu bạn thấy lỗi này, hãy dừng bất cứ điều gì khác bạn đang làm. Đừng điều chỉnh vòng lặp của bạn. Đừng cố cài đặt thư viện Python mới. Đừng khởi động lại máy tính của bạn, sau đó chạy lại tập lệnh để xem liệu lỗi có tự sửa chữa chính nó không.

Lỗi

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
3 xảy ra vì bạn không biết tệp thực sự ở đâu trên máy tính của bạn. Hoặc, ngay cả khi bạn làm như vậy, bạn không biết cách nói với chương trình Python của bạn ở đâu. Đừng cố sửa các phần khác trong mã của bạn không liên quan đến việc chỉ định tên tệp hoặc đường dẫn.

Cách sửa lỗi FileNotFounderror

Đây là một bản sửa lỗi chắc chắn: Đảm bảo rằng tệp thực sự tồn tại.

Hãy bắt đầu từ đầu bằng cách mắc lỗi. Trong vỏ hệ thống của bạn [tức là thiết bị đầu cuối], thay đổi sang thư mục máy tính để bàn của bạn:system shell [i.e. Terminal], change to your Desktop folder:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
7

Bây giờ, chạy ipython:ipython:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
8

Và bây giờ bạn đang ở trong trình thông dịch Python tương tác, hãy cố gắng mở một tên tệp mà bạn biết không tồn tại trên máy tính để bàn của bạn và sau đó thưởng thức thông báo lỗi:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
9
filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
0

Bây giờ tự tạo tệp trên máy tính để bàn của bạn, sử dụng văn bản siêu phàm 3 hoặc bất cứ điều gì bạn muốn. Thêm một số văn bản vào nó, sau đó lưu nó.on your Desktop, using Sublime Text 3 or whatever you want. Add some text to it, then save it.

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
1

Hãy xem và tự mình xem rằng tệp này thực sự tồn tại trong thư mục máy tính để bàn của bạn:Desktop folder:

OK, bây giờ chuyển trở lại với Shell Python tương tác của bạn [tức là ipython], cái mà bạn đã mở sau khi thay đổi vào thư mục máy tính để bàn [tức là

filename = open[newfile.txt
0]. Chạy lại lệnh
filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
2, lệnh dẫn đến FilenotFounderror:interactive Python shell [i.e. ipython], the one that you opened after changing into the Desktop folder [i.e.
filename = open[newfile.txt
0]. Re-run that
filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
2 command, the one that resulted in the FileNotFoundError:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
9

Hy vọng rằng, bạn không nên gặp lỗi.

Nhưng đối tượng mà biến

filename = open[newfile.txt
2 chỉ vào là gì? Sử dụng phương thức
filename = open[newfile.txt
3 để tìm ra nó:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
3

Và đó là gì? Các chi tiết không quan trọng, ngoài việc chỉ ra rằng

filename = open[newfile.txt
2 chắc chắn không chỉ là một chuỗi theo nghĩa đen, tức là
filename = open[newfile.txt
5.

Sử dụng Tab AutoComplete [nghĩa là loại trong

filename = open[newfile.txt
6] để lấy danh sách các phương thức và thuộc tính hiện có cho đối tượng
filename = open[newfile.txt
2:Tab autocomplete [i.e. type in
filename = open[newfile.txt
6] to get a list of existing methods and attributes for the
filename = open[newfile.txt
2 object:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
4

Chà, chúng ta có thể làm nhiều hơn với các tệp hơn là chỉ

filename = open[newfile.txt
8 từ chúng. Nhưng chúng ta hãy tập trung vào việc đọc bây giờ.

Cách đọc từ một tệp - một cuộc thám hiểm tương tác

Giả sử biến

filename = open[newfile.txt
2 chỉ vào một số loại đối tượng tệp, đây là cách bạn đọc từ nó:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
5

Có gì trong biến

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
0 đó? Một lần nữa, sử dụng chức năng
filename = open[newfile.txt
3:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
6

Nó chỉ là một chuỗi. Tất nhiên có nghĩa là chúng ta có thể in nó ra:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
7

Hoặc đếm số lượng ký tự:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
8

Hoặc in nó ra trong tất cả các bộ phim:

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
9

Và đó là tất cả những gì có để đọc từ một tập tin đã được mở.

Bây giờ vào những sai lầm.

Cách làm rối khi đọc từ một tệp

Đây là một lỗi rất, rất phổ biến:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
0

Đầu ra lỗi:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
1

Lưu ý cẩn thận rằng đây không phải là một filenotfounderror. Nó là một thuộc tính - mà, được thừa nhận, không rõ ràng lắm - nhưng đọc phần tiếp theo:FileNotFoundError. It is an AttributeError – which, admittedly, is not very clear – but read the next part:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
2

Thông báo lỗi đi đến điểm: đối tượng

filename = open[newfile.txt
5 - tức là một chuỗi theo nghĩa đen, ví dụ: Một cái gì đó như
filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
3 không có thuộc tính
filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
4.

Xem lại mã sai lầm:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
0

Nếu

filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
5 trỏ vào "example.txt", thì
filename = open['C:\\Python25\\Test scripts\\newfile','r']
print filename.read[]
5 chỉ đơn giản là một đối tượng
filename = open[newfile.txt
5.

Nói cách khác, tên tệp không phải là đối tượng tệp. Dưới đây là một ví dụ rõ ràng hơn về mã số lỗi:file name is not a file object. Here's a clearer example of errneous code:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
4

Và để đánh bại điểm về đầu:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
5

Tại sao đây là một sai lầm phổ biến như vậy? Bởi vì trong 99% các tương tác điển hình của chúng tôi với các tệp, chúng tôi thấy một tên tệp trên giao diện đồ họa máy tính để bàn của chúng tôi và chúng tôi nhấp đúp vào tên tệp đó để mở nó. Giao diện đồ họa phản đối quá trình - và vì lý do chính đáng. Ai quan tâm những gì đang xảy ra miễn là tập tin của tôi mở ra khi tôi nhấp đúp vào nó!

Thật không may, chúng ta phải quan tâm khi cố gắng đọc một tệp theo chương trình. Mở một tập tin là một hoạt động riêng biệt từ việc đọc nó.

  • Bạn mở một tệp bằng cách truyền tên tệp của nó - ví dụ:
    filename = open['C:\Python25\Test scripts\newfile.txt','r']
    print filename.read[]
    
    1 - vào hàm
    filename = open['C:\Python25\Test scripts\newfile.txt','r']
    print filename.read[]
    
    2. Hàm
    filename = open['C:\Python25\Test scripts\newfile.txt','r']
    print filename.read[]
    
    2 trả về một đối tượng tệp.
  • Để thực sự đọc nội dung của một tệp, bạn gọi phương thức Read [] của đối tượng đó.read[] method.

Một lần nữa, đây là mã, theo kiểu dài dòng hơn một chút:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
6

Đối tượng tệp cũng có phương thức

with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]
1, chính thức làm sạch sau khi tệp đã mở và cho phép các chương trình khác truy cập nó một cách an toàn. Một lần nữa, đó là một chi tiết cấp thấp mà bạn không bao giờ nghĩ đến trong điện toán hàng ngày. Trên thực tế, đó là điều mà bạn có thể sẽ quên trong bối cảnh lập trình, vì không đóng tệp sẽ không tự động phá vỡ bất cứ điều gì [cho đến khi chúng tôi bắt đầu thực hiện các loại hoạt động tệp phức tạp hơn nhiều, ít nhất là. Thông thường, ngay sau khi một tập lệnh kết thúc, bất kỳ tệp không bị xóa nào cũng sẽ tự động được đóng.

Tuy nhiên, tôi thích đóng tệp một cách rõ ràng - không chỉ ở phía an toàn - mà còn giúp củng cố khái niệm của đối tượng tệp đó.

Cách đọc từ một tệp-từng dòng

Một trong những lợi thế của việc đi vào các chi tiết cấp thấp hơn về việc mở và đọc từ các tệp là giờ đây chúng ta có khả năng đọc các tệp theo từng dòng, thay vì một đoạn khổng lồ. Một lần nữa, để đọc các tệp dưới dạng một khối nội dung khổng lồ, hãy sử dụng phương thức

filename = open[newfile.txt
8:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
7

Bây giờ có vẻ như không phải là một vấn đề lớn như vậy, nhưng đó là vì

filename = open['C:\Python25\Test scripts\newfile.txt','r']
print filename.read[]
1 có thể chỉ chứa một vài dòng. Nhưng khi chúng tôi đối phó với các tập tin khổng lồ - như tất cả 3,3 triệu hồ sơ của tất cả những người đã quyên góp hơn 200 đô la cho một ủy ban chiến dịch tranh cử tổng thống Hoa Kỳ vào năm 2012 hoặc tất cả những người đã từng đến Nhà Trắng - mở và đọc tập tin cùng một lúc chậm hơn đáng kể. Và nó thậm chí có thể làm hỏng máy tính của bạn.

Nếu bạn đã tự hỏi tại sao phần mềm bảng tính, chẳng hạn như Excel, có giới hạn các hàng [khoảng 1.000.000], đó là vì hầu hết người dùng muốn hoạt động trên tệp dữ liệu, tất cả cùng một lúc. Tuy nhiên, nhiều tệp dữ liệu thú vị quá lớn cho điều đó. Chúng tôi sẽ gặp phải những kịch bản đó sau đó trong quý.

Hiện tại, đây là những gì đọc từng dòng thường trông giống như:

filename = open['C:\Python25\Test scripts\newfile','r']
print filename.read[]
3

Bởi vì mỗi dòng trong TextFile có một ký tự dòng mới [được biểu diễn dưới dạng

with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]
4 nhưng thường là "vô hình"], việc gọi hàm in [] sẽ tạo ra đầu ra hai khoảng cách, bởi vì print [] thêm một dòng mới vào những gì nó xuất ra [tức là. Hãy suy nghĩ lại chương trình
with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]
5 ban đầu của bạn].newline character [which is represented as
with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]
4 but is typically "invisible"], invoking the print[] function will create double-spaced output, because print[] adds a newline to what it outputs [i.e. think back to your original
with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]
5 program].

Để loại bỏ hiệu ứng đó, hãy gọi phương thức

with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]
6, thuộc về các đối tượng
filename = open[newfile.txt
5 và xóa các ký tự khoảng trắng khỏi bên trái và bên phải của chuỗi văn bản:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
9

Và tất nhiên, bạn có thể làm cho mọi thứ ồn ào với chức năng il '

with open['C:\\Python25\\Test scripts\\newfile'] as myfile:
print[myfile.read[]]
8 tốt:

fpath = r'C:\Python25\Test scripts\newfile'
if not os.path.exists[fpath]:
  print 'File does not exist'
  return

with open[fpath, 'r'] as src:
  src.read[]
9

Đó là nó bây giờ. Chúng tôi không đề cập đến cách ghi vào một tệp [đó là một hoạt động nguy hiểm hơn nhiều] - Tôi lưu nó cho một bài học riêng. Nhưng nó đủ để biết rằng khi xử lý các tệp như một lập trình viên, chúng ta phải rõ ràng và cụ thể hơn nhiều trong các bước.write to a file [which is a far more dangerous operation] – I save that for a separate lesson. But it's enough to know that when dealing with files as a programmer, we have to be much more explicit and specific in the steps.

Tại sao tệp của tôi không được đọc trong Python?

Bạn phải đặt lại con trỏ tệp trước khi đọc. Nếu bạn không, nó sẽ cố gắng đọc từ vị trí cuối cùng của bản ghi cuối cùng, đó là kết thúc của tệp nếu tệp mới. Vì vậy, nó không trả lại gì. Lưu câu trả lời này.reset the file pointer before reading. If you don't, it tries to read from the position of the end of the last write, which is the end of the file if the file is new. Thus, it returns nothing. Save this answer.

Làm thế nào để tôi có được Python để đọc một tập tin?

Để đọc một tệp văn bản trong Python, bạn làm theo các bước sau: Đầu tiên, hãy mở một tệp văn bản để đọc bằng cách sử dụng hàm Open [].Thứ hai, đọc văn bản từ tệp văn bản bằng cách sử dụng phương thức read [], readline [] hoặc readlines [] của đối tượng tệp.Thứ ba, đóng tệp bằng phương thức đóng tệp [].

Làm cách nào để xem các tệp .py?

Các chương trình mở các tệp PY..
Trình xem tệp cộng ..
Quỹ phần mềm Python Python ..
Microsoft Visual Studio Code ..
Microsoft Notepad.Đi kèm với hệ điều hành ..
Notepad++.
Văn bản siêu phàm ..
Jetbrains Pycharm ..
Trình chỉnh sửa văn bản khác ..

Làm cách nào để đọc tệp .text trong Python?

Có 6 chế độ truy cập trong Python ...
Chỉ đọc ['r']: Mở tệp văn bản để đọc.....
Đọc và viết ['R+']: Mở tệp để đọc và viết.....
Chỉ viết ['W']: Mở tệp để viết.....
Viết và đọc ['W+']: Mở tệp để đọc và viết.....
Chỉ nối thêm ['A']: Mở tệp để viết ..

Bài Viết Liên Quan

Chủ Đề