2013-07-19 9 views
6

में जोड़ने के लिए मैंने निर्देशिका में सभी फ़ाइलों को एक फ़ाइल में संयोजित करने के लिए निम्न स्क्रिप्ट लिखी है।पाइथन स्क्रिप्ट निर्देशिका में सभी फ़ाइलों को एक फ़ाइल में

import time, glob 

outfilename = 'all_' + str((int(time.time()))) + ".txt" 

filenames = glob.glob('*.txt') 

with open(outfilename, 'wb') as outfile: 
    for fname in filenames: 
     with open(fname, 'r') as readfile: 
      infile = readfile.read() 
      for line in infile: 
       outfile.write(line) 
      outfile.write("\n\n") 
+7

समय के लिए अनुकूलित? "cat * .txt> all.txt" का उपयोग करें :) :) –

+0

संभावित डुप्लिकेट [एकाधिक पाठ फ़ाइलों को पाइथन का उपयोग करके एक टेक्स्ट फ़ाइल में गठबंधन करें] (http://stackoverflow.com/questions/17749058/combine-multiple-text-files- इन-वन-टेक्स्ट-फ़ाइल-उपयोग-पायथन) – llb

उत्तर

23

उपयोग shutil.copyfileobj:

import shutil 

with open(outfilename, 'wb') as outfile: 
    for filename in glob.glob('*.txt'): 
     if filename == outfilename: 
      # don't want to copy the output into the output 
      continue 
     with open(filename, 'rb') as readfile: 
      shutil.copyfileobj(readfile, outfile) 

shutil, मात्रा में readfile वस्तु से पढ़ता है उन्हें outfile fileobject के लिए लिख सीधे। readline() या पुनरावृत्ति बफर का उपयोग न करें, क्योंकि आपको लाइन एंडिंग खोजने के ऊपरी हिस्से की आवश्यकता नहीं है।

पढ़ने और लिखने दोनों के लिए एक ही मोड का उपयोग करें; पायथन 3 का उपयोग करते समय यह विशेष रूप से महत्वपूर्ण है; मैंने दोनों के लिए बाइनरी मोड का उपयोग किया है।

+0

लेखन और पढ़ने के लिए एक ही मोड का उपयोग करना महत्वपूर्ण क्यों है? –

+1

@ जुआन डेविड: क्योंकि शिल एक दूसरे से ऑब्जेक्ट को '.read()' कॉल का उपयोग करेगा, अन्य फाइल ऑब्जेक्ट पर कॉल करें।यदि कोई बाइनरी मोड में खुला है, तो दूसरा पाठ में, आप असंगत डेटा (एक फ़ाइल फ़ाइल में बाइनरी डेटा, या बाइनरी फ़ाइल में टेक्स्ट डेटा) से गुज़र रहे हैं। –

0

आप अधिक पुनरावृति कर सकते हैं:

इस

  1. मुहावरेदार अजगर के मामले में अनुकूलित किया जा सकता है,

  2. समय

यहाँ टुकड़ा है एल सीधे किसी फ़ाइल वस्तु की Ines, स्मृति में पूरी बात पढ़ने के बिना: डेटा की प्रतिलिपि

with open(fname, 'r') as readfile: 
    for line in readfile: 
     outfile.write(line) 
1

कई चरों का उपयोग करने की आवश्यकता नहीं है।

with open(outfilename, 'w') as outfile: 
    for fname in filenames: 
     with open(fname, 'r') as readfile: 
      outfile.write(readfile.read() + "\n\n") 
1

fileinput मॉड्यूल एक से अधिक फ़ाइलों

से अधिक पुनरावृति के लिए एक प्राकृतिक तरीका प्रदान करता है
for line in fileinput.input(glob.glob("*.txt")): 
    outfile.write(line) 
+0

यह तब भी बेहतर होगा अगर वह एक समय में एक लाइन पढ़ने के लिए खुद को सीमित न करे। – Marcin

+0

@ मार्सिन, यह सही है। मुझे लगता था कि यह एक अच्छा समाधान था - जब तक मैंने मार्टिजन पीटर के 'shutil.copyfileobj' humdinger देखा। – iruvar

1

अजगर 2.7 का उपयोग करना, मैंने किया था कुछ "बेंचमार्क" बनाम

shutil.copyfileobj(readfile, outfile) 

outfile.write(infile.read()) 

के परीक्षण

मैंने ~ 2.6 जीबी के संयुक्त फ़ाइल आकार के साथ 63 एमबी से 313 एमबी के आकार में 20 .txt फ़ाइलों को दोहराया। दोनों तरीकों से, सामान्य रीड मोड बाइनरी रीड मोड से बेहतर प्रदर्शन करता है और shutil.copyfileobj आमतौर पर outfile.write से तेज़ था।

जब सबसे अच्छा संयोजन के साथ सबसे खराब संयोजन (outfile.write, द्विआधारी मोड) (shutil.copyfileobj, सामान्य पढ़ने मोड) की तुलना, अंतर काफी महत्वपूर्ण था:

outfile.write, binary mode: 43 seconds, on average. 

shutil.copyfileobj, normal mode: 27 seconds, on average. 

outfile एक अंतिम आकार था सामान्य पढ़ने मोड में 2620 एमबी की बाइनरी रीड मोड में 2578 एमबी बनाम।

+0

दिलचस्प। वह मंच क्या था? – ellockie

+0

मैं लगभग दो प्लेटफ़ॉर्म पर काम करता हूं: लिनक्स फेडोरा 16, इंटेल कोर (टीएम) 2 क्वाड सीपीयू Q9550, 2.83 गीगाहर्ट्ज के साथ विभिन्न नोड्स या विंडोज 7 एंटरप्राइज़ एसपी 1। मुझे लगता है कि यह बाद वाला था। –

+0

जानकारी के लिए धन्यवाद! – ellockie

संबंधित मुद्दे

 संबंधित मुद्दे