Kể từ Python 3.3, bạn có thể sử dụng lớp
from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
1 từ mô -đun from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
2 để an toàn một số lượng tệp tùy ý.open an arbitrary number of files.
Nó có thể quản lý một số lượng động của các đối tượng nhận biết bối cảnh, điều đó có nghĩa là nó sẽ chứng minh đặc biệt hữu ích nếu bạn không biết bạn sẽ xử lý bao nhiêu tệp.
Trên thực tế, trường hợp sử dụng chính tắc được đề cập trong tài liệu là quản lý một số lượng tệp động.
with ExitStack[] as stack:
files = [stack.enter_context[open[fname]] for fname in filenames]
# All opened files will automatically be closed at the end of
# the with statement, even if attempts to open files later
# in the list raise an exception
Nếu bạn quan tâm đến các chi tiết, đây là một ví dụ chung để giải thích cách
from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
1 hoạt động:from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
Output:
0
enter X1
enter X2
enter X3
3
exit X3
exit X2
exit X1
0
[1, 2, 3]
Câu trả lời được đề xuất
Bạn có thể đăng một số mã của bạn? Tôi bối rối về lý do tại sao bạn cần phải mở rất nhiều tệp cùng một lúc ... bạn có thể đạp xe từng cái một và không mở tất cả chúng không?
Nhảy để đăng
Số lượng tệp mở tối đa mà một quy trình được phép có từ hệ điều hành.
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".
Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện
Nhảy để đăng
Số lượng tệp mở tối đa mà một quy trình được phép có từ hệ điều hành.
If you are needing to open 100+ files at once, you should perhaps re factor your code and design.Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".
Nhảy để đăng
Số lượng tệp mở tối đa mà một quy trình được phép có từ hệ điều hành.
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".
Bạn có thể đăng một số mã của bạn? Tôi bối rối về lý do tại sao bạn cần phải mở rất nhiều tệp cùng một lúc ... bạn có thể đạp xe từng cái một và không mở tất cả chúng không?
Nhảy để đăng 5,138 Posting Sage Số lượng tệp mở tối đa mà một quy trình được phép có từ hệ điều hành.
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".
Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện
Câu hỏi của tôi: Chúng ta có thực sự cần điều này không? Tại sao? Nếu bạn cần mở hơn 100 tệp cùng một lúc, có lẽ bạn nên làm lại mã và thiết kế của mình.
BTW, nếu bạn đang sử dụng *inx [UNIX, Linux], bạn có thể chạy lệnh sau để biết số lượng tối đa của 1,429 Practically a Posting Shark
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".Số lượng tệp mở tối đa mà một quy trình được phép có từ hệ điều hành.
If you are needing to open 100+ files at once, you should perhaps re factor your code and design.
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".
Note that $ is my shell prompt.
$ cat /proc/sys/fs/file-max
95141
Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện
To change this use: where 104854 is max number which
you want.
$ echo "104854" > /proc/sys/fs/file-max
Câu hỏi của tôi: Chúng ta có thực sự cần điều này không? Tại sao? Nếu bạn cần mở hơn 100 tệp cùng một lúc, có lẽ bạn nên làm lại mã và thiết kế của mình.
$ cat /proc/sys/fs/file-nr
5024 0 95141
BTW, nếu bạn đang sử dụng *inx [UNIX, Linux], bạn có thể chạy lệnh sau để biết số lượng tối đa của
Tất cả 12 câu trả lời 320 Veteran Poster
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện
Câu hỏi của tôi: Chúng ta có thực sự cần điều này không? Tại sao? Nếu bạn cần mở hơn 100 tệp cùng một lúc, có lẽ bạn nên làm lại mã và thiết kế của mình.
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".
Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện
Câu hỏi của tôi: Chúng ta có thực sự cần điều này không? Tại sao? Nếu bạn cần mở hơn 100 tệp cùng một lúc, có lẽ bạn nên làm lại mã và thiết kế của mình.
Name_List = ['AluSp', 'AluGp', 'AluSx' ... 'ZZcta' ]
BTW, nếu bạn đang sử dụng *inx [UNIX, Linux], bạn có thể chạy lệnh sau để biết số lượng tối đa của
AluSp.bed, AluGp.bed, AluSx.bed...ZZcta.bed
Tất cả 12 câu trả lời
13 năm trước
Salem5.138 Sage đăng bài
Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện từ phía bạn.
Chỉ cần xem xét nó trong các thiết kế trong tương lai của bạn rằng bạn không có số lượng tệp mở không giới hạn để chơi. 969 Nearly a Posting Maven
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện
...
Câu hỏi của tôi: Chúng ta có thực sự cần điều này không? Tại sao? Nếu bạn cần mở hơn 100 tệp cùng một lúc, có lẽ bạn nên làm lại mã và thiết kế của mình.
for line in file[filename]:
# do something with line
BTW, nếu bạn đang sử dụng *inx [UNIX, Linux], bạn có thể chạy lệnh sau để biết số lượng tối đa của
Thường có thể thay đổi điều này [nhưng chi tiết khác nhau], nhưng làm như vậy gần như chắc chắn đòi hỏi các đặc quyền "quản trị viên/root".
Đó cũng là một cái gì đó không nên được thực hiện nhẹ để tiết kiệm một chút bất tiện
Câu hỏi của tôi: Chúng ta có thực sự cần điều này không? Tại sao? Nếu bạn cần mở hơn 100 tệp cùng một lúc, có lẽ bạn nên làm lại mã và thiết kế của mình.
Name_List = ['AluSp', 'AluGp', 'AluSx' ... 'ZZcta' ]
Đối với mỗi tên trong danh sách tên, tôi muốn lưu trữ một tệp cùng tên, ví dụ:
AluSp.bed, AluGp.bed, AluSx.bed...ZZcta.bed
Chương trình sẽ hủy bỏ tệp dữ liệu và đối với mỗi tên, dòng đó được ghi vào tệp thích hợp.
Vì tệp dữ liệu thô quá lớn, tôi không thể mở một tệp cho một tên trong danh sách, quét toàn bộ tệp dữ liệu, chỉ nối các mục cho tên đầu tiên [alusp.bed] và sau đó đóng. Làm như vậy sẽ yêu cầu 110 lần quét tệp 50 triệu dòng. Những gì tôi đang làm là quét tệp dữ liệu thô một lần, trong khi tất cả các tệp tên 110 vẫn mở và đối với mỗi dòng trong tệp dữ liệu, dòng đó được ghi vào tệp tên thích hợp.
Đa ro chưa?
Mã này được đặt đúng chỗ, vì vậy nếu bạn muốn xem nó, tôi có thể đăng nó.
Mặc dù vậy, không cần phải giữ tất cả các tệp cùng một lúc. Thay vì có một danh sách 100 tay cầm tệp thay thế nó bằng một danh sách các tên tệp, thì mỗi lần bạn muốn viết cho một trong số chúng chỉ cần mở tệp, hãy ghi vào nó, sau đó đóng nó.
13 năm trước
Mặc dù vậy, không cần phải giữ tất cả các tệp cùng một lúc. Thay vì có một danh sách 100 tay cầm tệp thay thế nó bằng một danh sách các tên tệp, thì mỗi lần bạn muốn viết cho một trong số chúng chỉ cần mở tệp, hãy ghi vào nó, sau đó đóng nó.
13 năm trước
13 năm trước
13 năm trước
Không phải là quá trình mở và đóng tệp khiến nó bị ghi đè, thay vì dòng được thêm vào?
13 năm trước
Không phải là quá trình mở và đóng tệp khiến nó bị ghi đè, thay vì dòng được thêm vào?
Anyways, if you open a file with
from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
4 then when you call from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
5 on it, it'll just append it. Like The_Kernel said, just make sure you keep track of whether the file has been created yet, and if not, open it with the mode parameter as "w".
13 năm trước
Không phải là quá trình mở và đóng tệp khiến nó bị ghi đè, thay vì dòng được thêm vào?
Thanks.
Không nếu bạn mở nó ở chế độ phụ lục. Điều đó có nghĩa là bất cứ điều gì trước đây trong tệp sẽ ở đó và điều này có thể không mong muốn trong lần ghi đầu tiên [vì bạn muốn tệp chỉ chứa dữ liệu từ lần chạy hiện tại có lẽ]. Để khắc phục điều này, chỉ cần theo dõi xem bạn đã viết vào tệp trước đó; Nếu bạn đã mở nó ở chế độ Phụ lục, nếu không hãy mở nó ở chế độ ghi. 320 Veteran Poster
13 năm trướcKhông phải là quá trình mở và đóng tệp khiến nó bị ghi đè, thay vì dòng được thêm vào?
Không nếu bạn mở nó ở chế độ phụ lục. Điều đó có nghĩa là bất cứ điều gì trước đây trong tệp sẽ ở đó và điều này có thể không mong muốn trong lần ghi đầu tiên [vì bạn muốn tệp chỉ chứa dữ liệu từ lần chạy hiện tại có lẽ]. Để khắc phục điều này, chỉ cần theo dõi xem bạn đã viết vào tệp trước đó; Nếu bạn đã mở nó ở chế độ Phụ lục, nếu không hãy mở nó ở chế độ ghi.
Bây giờ tôi tò mò mất bao lâu để máy tính của bạn phân tích "tệp dòng 50 triệu" này với Python, xem Python chậm như thế nào so với những thứ như C ... trừ khi tất nhiên bạn đang phóng đại số lượng dòng. Dù sao, nếu bạn mở một tệp với
from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
4 thì khi bạn gọi from contextlib import ExitStack
class X:
num = 1
def __init__[self]:
self.num = X.num
X.num += 1
def __repr__[self]:
cls = type[self]
return '{cls.__name__}{self.num}'.format[cls=cls, self=self]
def __enter__[self]:
print['enter {!r}'.format[self]]
return self.num
def __exit__[self, exc_type, exc_value, traceback]:
print['exit {!r}'.format[self]]
return True
xs = [X[] for _ in range[3]]
with ExitStack[] as stack:
print[len[stack._exit_callbacks]] # number of callbacks called on exit
nums = [stack.enter_context[x] for x in xs]
print[len[stack._exit_callbacks]]
print[len[stack._exit_callbacks]]
print[nums]
5 trên đó, nó sẽ chỉ nối nó. Giống như_kernel đã nói, chỉ cần đảm bảo bạn theo dõi xem tệp có được tạo hay không, và nếu không, hãy mở nó bằng tham số chế độ là "W".Áp phích kỳ cựu JLM699320