Hay un archivo que me gustaría asegurar que no crezca más de 2 GB (ya que debe ejecutarse en un sistema que usa ext 2). ¿Cuál es una buena manera de verificar el tamaño de un archivo teniendo en cuenta que escribiré en este archivo entre revisiones? En particular, ¿debo preocuparme por los cambios almacenados en búfer que aún no se han escrito en el disco?¿Cómo determino el tamaño de un archivo abierto en Python?
Respuesta
Se podría empezar con algo como esto:
class TrackedFile(file):
def __init__(self, filename, mode):
self.size = 0
super(TrackedFile, self).__init__(filename, mode)
def write(self, s):
self.size += len(s)
super(TrackedFile, self).write(s)
entonces se podría utilizar de esta manera:
>>> f = TrackedFile('palindrome.txt', 'w')
>>> f.size
0
>>> f.write('A man a plan a canal ')
>>> f.size
21
>>> f.write('Panama')
27
Obviamente, esta aplicación no funciona si no está escribiendo el archivo desde cero, pero podría adaptar su método __init__
para manejar los datos iniciales. Es posible que también deba sobrescribir algunos otros métodos: writelines
, por ejemplo.
Esto funciona independientemente de la codificación, ya que las cadenas son solo secuencias de bytes.
>>> f2 = TrackedFile('palindrome-latin1.txt', 'w')
>>> f2.write(u'A man a plan a canál '.encode('latin1')
>>> f3 = TrackedFile('palindrome-utf8.txt', 'w')
>>> f3.write(u'A man a plan a canál '.encode('utf-8'))
>>> f2.size
21
>>> f3.size
22
+1: Esa es una idea realmente inteligente. ¡Me gusta! – jathanism
Eso no es en realidad. Si usa ASCII, ISO1559 y UTF-8, el resultado será el mismo, pero el tamaño del disco no lo será. –
No. Funciona para otras codificaciones también, si usa cadenas reales. Respuesta modificada para demostrar. – jcdyer
Quizás no sea lo que quiere, pero lo sugeriré de todos modos.
import os
a = os.path.getsize("C:/TestFolder/Input/1.avi")
alternativa para un archivo abierto se puede utilizar la función fstat, que puede ser utilizado en un archivo abierto. Se necesita un identificador de archivo entero, no un objeto de archivo, así que hay que utilizar el método fileno en el objeto de archivo:
a = open("C:/TestFolder/Input/1.avi")
b = os.fstat(a.fileno()).st_size
más fiable sería crear una clase envoltorio que comprobar el tamaño del archivo cuando se abre, realizar un seguimiento de las operaciones de escritura y búsqueda, contar el tamaño actual en función de esas operaciones y evitar exceder el límite de tamaño.
O bien, si el archivo ya está abierto:
>>> fsock = open('/etc/hosts', 'rb').read()
>>> len(fsock)
444
Esa es la cantidad de bytes del archivo es.
os.fstat(file_obj.fileno()).st_size
deberían hacer el truco. Creo que devolverá los bytes escritos. Siempre puede hacer un color antes de la mano si le preocupa el almacenamiento en búfer.
¡Y funciona también en el modo de adición! Gracias. Y sí, me sonrojaría antes de llamar a esto. –
No estoy familiarizado con Python, pero ¿el objeto de transmisión (o lo que se obtiene al abrir un archivo) tiene una propiedad que contiene la posición actual de la secuencia?
Similar a lo que obtienes con la función ftell() C, o Stream.Position en .NET.
Obviamente, esto solo funciona si se encuentra al final de la secuencia, que es usted si actualmente está escribiendo en ella.
El beneficio de este enfoque es que no tiene que cerrar el archivo o preocuparse por los datos no eliminados.
'filehandle.tell()' de hecho muestra el número de bytes en el archivo abierto, y funciona en modo de escritura o de adición. No estoy seguro de por qué todas estas respuestas más complejas se subieron. – hurfdurf
@hurfdurf No, 'f.tell()' no parece funcionar de manera confiable en el modo de adición. A menos que primero 'f.seek (0,2)'. No tengo ni idea de porqué. –
Aunque esta es una vieja pregunta, creo que Isak tiene la solución más simple. Así es como hacerlo en Python:
# Assuming f is an open file
>>> pos = f.tell() # Save the current position
>>> f.seek(0, 2) # Seek to the end of the file
>>> length = f.tell() # The current position is the length
>>> f.seek(pos) # Return to the saved position
>>> print length
1024
Creo que en la primera línea (guardar la posición actual), debe usar f.tell(), no seek(), lo que causaría una excepción ya que seek() necesita al menos 1 argumento. – Jkm
@Jkm Sí, tienes razón! No estoy seguro de cómo me perdí eso. ¡Gracias! – Trenton
Esto calculará correctamente el tamaño del archivo, pero no restaurará la posición correctamente debido a problemas conocidos con [tell in append mode] (https://stackoverflow.com/questions/31680677/). –
- 1. Tamaño de un objeto de archivo abierto
- 2. ¿Cómo determino el tamaño máximo de transacción en MySQL?
- 3. ¿Cómo determino HResult para System.IO.IOException?
- 4. La forma más rápida para calcular el tamaño de un archivo abierto en el código (PHP)
- 5. Obtener ruta desde el archivo abierto en Python
- 6. compruebe si un archivo está abierto en Python
- 7. Cómo leer un archivo abierto en Ruby
- 8. Cómo tener un archivo abierto normalmente en Resharper en lugar de en el modo "Mantener abierto"
- 9. ¿Puedo usar un archivo gzip abierto con Popen en Python?
- 10. ¿Cómo determino el propietario de un proceso en C#?
- 11. ¿Cómo verificar el tamaño de un archivo?
- 12. python. obtener el tamaño de un objeto
- 13. ¿Cómo determino el tipo de contenido de un archivo en .NET?
- 14. ¿Cómo determino el archivo y el número de línea de un método C# de un archivo de símbolos (.pdb)?
- 15. Archivo abierto: ¿Es este el mal estilo de Python?
- 16. crear archivo de tamaño particular en python
- 17. Obtener tamaño de archivo en Python?
- 18. ¿Cómo determino la visibilidad de un control?
- 19. ¿Cómo determino el tamaño de píxel verdadero de mi monitor en .NET?
- 20. Archivo de datos de audio en bruto abierto Python
- 21. ¿Cómo obtener un control win32 de un archivo abierto en python?
- 22. ¿Cómo obtener el nombre de un archivo abierto?
- 23. dinámicamente cambiar el tamaño de un acordeón abierto
- 24. ¿Cómo determinar el tamaño de un icono de un HICON?
- 25. ¿Cómo establecer el tamaño inicial de un diccionario en Python?
- 26. ¿Cómo verificar el tamaño de un flotador en python?
- 27. cómo comprobar el archivo abierto sin lsof
- 28. ¿Cómo determino scrollHeight?
- 29. Obtención del último archivo abierto en el cuadro de diálogo de archivo abierto
- 30. ¿Cómo debo manejar un XMLSyntaxError en el archivo lxml de Python al analizar un archivo XML de gran tamaño?
¿Hay alguna razón no se puede simplemente hacer un seguimiento del tamaño del archivo sí mismo - es decir, ver lo que el tamaño es cuando se abre y incrementar un contador cuando se escribe ?No es particularmente elegante, pero debería funcionar. –
Supongo que es una posibilidad en la que no había pensado ... Podría intentar eso también. –
¿No es eso tan ineficiente como el infierno? –