Как читать и писать несколько файлов? - PullRequest
10 голосов
/ 16 октября 2008

Я хочу написать программу для этого: в папке у меня есть n количество файлов; сначала прочитайте один файл и выполните некоторую операцию, затем сохраните результат в отдельном файле. Затем прочитайте 2-й файл, снова выполните операцию и сохраните результат в новом 2-м файле. Проделайте ту же процедуру для n количества файлов. Программа читает все файлы по одному и сохраняет результаты каждого файла отдельно. Пожалуйста, приведите примеры, как я могу это сделать.

Ответы [ 6 ]

12 голосов
/ 16 октября 2008
import sys

# argv is your commandline arguments, argv[0] is your program name, so skip it
for n in sys.argv[1:]:
    print(n) #print out the filename we are currently processing
    input = open(n, "r")
    output = open(n + ".out", "w")
    # do some processing
    input.close()
    output.close()

Тогда назовите это как:

./foo.py bar.txt baz.txt
9 голосов
/ 16 октября 2008

Я думаю, что вам не хватает, как получить все файлы в этом каталоге. Для этого используйте модуль glob. Вот пример, который будет дублировать все файлы с расширением * .txt на файлы с расширением * .out

import glob

list_of_files = glob.glob('./*.txt')           # create the list of file
for file_name in list_of_files:
  FI = open(file_name, 'r')
  FO = open(file_name.replace('txt', 'out'), 'w') 
  for line in FI:
    FO.write(line)

  FI.close()
  FO.close()
7 голосов
/ 16 октября 2008

Вы можете найти полезным модуль fileinput. Он предназначен именно для этой проблемы.

1 голос
/ 17 октября 2008

Я только что узнал о команде os.walk () недавно, и она может помочь вам здесь. Позволяет пройтись по древовидной структуре каталогов.

import os
OUTPUT_DIR = 'C:\\RESULTS'
for path, dirs, files in os.walk('.'):
    for file in files:
        read_f = open(os.join(path,file),'r')
        write_f = open(os.path.join(OUTPUT_DIR,file))

        # Do stuff
0 голосов
/ 14 августа 2012
from pylab import * 
import csv 
import os 
import glob 
import re 
x=[] 
y=[]

f=open("one.txt",'w')

for infile in glob.glob(('*.csv')):
    #   print "" +infile
    csv23=csv2rec(""+infile,'rb',delimiter=',')
    for line in csv23:      
        x.append(line[1])
        #  print len(x)
    for i in range(3000,8000):
        y.append(x[i])
    print ""+infile,"\t",mean(y)
    print >>f,""+infile,"\t\t",mean(y)
    del y[:len(y)]
    del x[:len(x)]
0 голосов
/ 16 октября 2008

Комбинированный ответ, включающий каталог или определенный список аргументов имен файлов:

import sys
import os.path
import glob

def processFile(filename):
    fileHandle = open(filename, "r")
    for line in fileHandle:
        # do some processing
        pass
    fileHandle.close()

def outputResults(filename):
    output_filemask = "out"
    fileHandle = open("%s.%s" % (filename, output_filemask), "w")
    # do some processing
    fileHandle.write('processed\n')
    fileHandle.close()

def processFiles(args):
    input_filemask = "log"
    directory = args[1]
    if os.path.isdir(directory):
        print "processing a directory"
        list_of_files = glob.glob('%s/*.%s' % (directory, input_filemask))
    else:
        print "processing a list of files"
        list_of_files = sys.argv[1:]

    for file_name in list_of_files:
        print file_name
        processFile(file_name)
        outputResults(file_name)

if __name__ == '__main__':
    if (len(sys.argv) > 1):
        processFiles(sys.argv)
    else:
        print 'usage message'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...