txt - leer una linea especifica de un archivo en python
Concatene mĂșltiples archivos en un solo objeto de archivo sin crear un nuevo archivo (8)
Digamos que multiple_files
es una lista que contiene todos los nombres de archivos
multiple_files = ["file1.txt", "file2.txt", "file3.txt", ...] # and so on...
Abra el archivo de salida que contendrá todos
f = open("multiple_files.txt", "w")
for _file in multiple_files:
f.write(_file.read())
De esta manera, no tiene que leer todas y cada una de las líneas de sus archivos.
Aunque el método anterior es más simple, también tiene un módulo de entrada de archivo como alternativa.
documentos de entrada de archivo
Puede utilizar fileinput para acceder y procesar múltiples archivos.
Ejemplo :
with fileinput.input(files=(''file1.txt'', ''file2.txt'')) as f:
for line in f:
process(line)
Esta pregunta está relacionada con los archivos de texto de Python concatenate
Tengo una lista de nombres de file_names
, como [''file1.txt'', ''file2.txt'', ...].
Me gustaría abrir todos los archivos en un solo objeto de archivo que pueda leer línea por línea, pero no quiero crear un nuevo archivo en el proceso. ¿Es eso posible?
with open(file_names, ''r'') as file_obj:
line = file_obj.readline()
while line:
...
EDITAR:
Como se señaló en los comentarios, esta solución probablemente no sería óptima para archivos grandes, ya que carga todo en la memoria. Una solución que use generadores sería mejor si se trata de archivos grandes. Gracias a LohmarASHAR por señalarlo!
Simplemente puede crear en la lista grande de todos los archivos haciendo un bucle sobre la lista de nombres de archivos. Esto no crearía un nuevo objeto de archivo, solo un nuevo objeto de lista:
filenames = ["f1.txt", "f2.txt", "f3.txt"]
# list to store each line of the file
output = []
# iterate over list of filenames
for text_file in filenames:
# open file
with open(text_file) as f:
# iterate over each line in the file and add to output
for line in f.readlines():
output.append(line)
No es que no estemos llamando explícitamente a close()
en el archivo, esto se debe a que la instrucción with...
cerrará el archivo por nosotros tan pronto como salga de su alcance.
Si puede usar bibliotecas externas, puede que valga la pena analizar los pandas para almacenar los datos del archivo en objetos eficientes y fáciles de usar.
En lugar de hacer que Python lea varios archivos, canalice el contenido desde el shell y léalo desde la entrada estándar. Esto también hará que su programa sea más flexible, ya que puede pasar cualquier conjunto de archivos a su programa de Python sin cambiar su código.
La forma más sencilla, es utilizar itertools.chain ,
que proporcionan una manera fácil de leer desde múltiples iteradores.
Haga un iterador que devuelva elementos desde el primer iterable hasta que se agote, luego pase al siguiente iterable, hasta que todos los iterables estén agotados. Se utiliza para tratar secuencias consecutivas como una secuencia única.
Supongamos que tiene los archivos: file1.txt
y file2.txt
.
file1.txt
datos de file1.txt
son:
file1 line1
file1 line2
Y, de la misma manera, los datos de file2.txt
son:
file2 line1
file2 line2
Este codigo
for f in chain(map(open, [''file1.txt'', ''file2.txt''])):
for line in f:
print(line.strip())
dará salida a esto:
file1 line1
file1 line2
file2 line1
file2 line2
Puede utilizar el paquete fileinput. Este módulo implementa una clase de ayuda y funciones para escribir rápidamente un bucle sobre una lista de archivos
import fileinput
with fileinput.input(files=(''file1.txt'', ''file2.txt'', ''file3.txt'')) as f:
for line in f:
#rest code
Usando incorporaciones:
product=[]
for File in [''file1.txt'',''file2.txt'',''file3.txt'']:
for line in open(File,''r'').readlines():
product.append(line)
for line in product:print(line)
file.readlines () envía el contenido a una lista y el archivo se cierra.
También podrías escribir:
product=[]
for File in [''file1.txt'',''file2.txt'',''file3.txt'']:
product+=open(File).readlines()
Es más corto y probablemente más rápido, pero uso el primero porque me parece mejor.
Aclamaciones
Utilice la input del módulo fileinput . Se lee de varios archivos, pero parece que las cadenas provienen de un solo archivo. (Iteración de la línea perezosa).
import fileinput
files= [''F:/files/a.txt'',''F:/files/c.txt'',''F:/files/c.txt'']
allfiles = fileinput.input(files)
for line in allfiles: # this will iterate over lines in all the files
print(line)
# or read lines like this: allfiles.readline()
Si necesitas todo el texto en un solo lugar usa StringIO
import io
files= [''F:/files/a.txt'',''F:/files/c.txt'',''F:/files/c.txt'']
lines = io.StringIO() #file like object to store all lines
for file_dir in files:
with open(file_dir, ''r'') as file:
lines.write(file.read())
lines.write(''/n'')
lines.seek(0) # now you can treat this like a file like object
print(lines.read())
intente algo en este sentido:
def read_files(*filenames):
for filename in filenames:
with open(filename,''r'') as file_obj:
for line in file_obj:
yield line
puedes llamarlo con
for line in read_files("f1.txt", "f2.txt", "f3.txt"):
#... do whatever with the line
o
filenames = ["f1.txt", "f2.txt", "f3.txt"]
for line in read_files(*filenames):
#... do whatever with the line