Python concatenate text files

后端 未结 12 1950
無奈伤痛
無奈伤痛 2020-11-22 02:51

I have a list of 20 file names, like [\'file1.txt\', \'file2.txt\', ...]. I want to write a Python script to concatenate these files into a new file. I could op

相关标签:
12条回答
  • 2020-11-22 03:07

    An alternative to @inspectorG4dget answer (best answer to date 29-03-2016). I tested with 3 files of 436MB.

    @inspectorG4dget solution: 162 seconds

    The following solution : 125 seconds

    from subprocess import Popen
    filenames = ['file1.txt', 'file2.txt', 'file3.txt']
    fbatch = open('batch.bat','w')
    str ="type "
    for f in filenames:
        str+= f + " "
    fbatch.write(str + " > file4results.txt")
    fbatch.close()
    p = Popen("batch.bat", cwd=r"Drive:\Path\to\folder")
    stdout, stderr = p.communicate()
    

    The idea is to create a batch file and execute it, taking advantage of "old good technology". Its semi-python but works faster. Works for windows.

    0 讨论(0)
  • 2020-11-22 03:11

    What's wrong with UNIX commands ? (given you're not working on Windows) :

    ls | xargs cat | tee output.txt does the job ( you can call it from python with subprocess if you want)

    0 讨论(0)
  • 2020-11-22 03:16
      import os
      files=os.listdir()
      print(files)
      print('#',tuple(files))
      name=input('Enter the inclusive file name: ')
      exten=input('Enter the type(extension): ')
      filename=name+'.'+exten
      output_file=open(filename,'w+')
      for i in files:
        print(i)
        j=files.index(i)
        f_j=open(i,'r')
        print(f_j.read())
        for x in f_j:
          outfile.write(x)
    
    0 讨论(0)
  • 2020-11-22 03:17

    Check out the .read() method of the File object:

    http://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

    You could do something like:

    concat = ""
    for file in files:
        concat += open(file).read()
    

    or a more 'elegant' python-way:

    concat = ''.join([open(f).read() for f in files])
    

    which, according to this article: http://www.skymind.com/~ocrow/python_string/ would also be the fastest.

    0 讨论(0)
  • 2020-11-22 03:24

    If the files are not gigantic:

    with open('newfile.txt','wb') as newf:
        for filename in list_of_files:
            with open(filename,'rb') as hf:
                newf.write(hf.read())
                # newf.write('\n\n\n')   if you want to introduce
                # some blank lines between the contents of the copied files
    

    If the files are too big to be entirely read and held in RAM, the algorithm must be a little different to read each file to be copied in a loop by chunks of fixed length, using read(10000) for example.

    0 讨论(0)
  • 2020-11-22 03:25

    That's exactly what fileinput is for:

    import fileinput
    with open(outfilename, 'w') as fout, fileinput.input(filenames) as fin:
        for line in fin:
            fout.write(line)
    

    For this use case, it's really not much simpler than just iterating over the files manually, but in other cases, having a single iterator that iterates over all of the files as if they were a single file is very handy. (Also, the fact that fileinput closes each file as soon as it's done means there's no need to with or close each one, but that's just a one-line savings, not that big of a deal.)

    There are some other nifty features in fileinput, like the ability to do in-place modifications of files just by filtering each line.


    As noted in the comments, and discussed in another post, fileinput for Python 2.7 will not work as indicated. Here slight modification to make the code Python 2.7 compliant

    with open('outfilename', 'w') as fout:
        fin = fileinput.input(filenames)
        for line in fin:
            fout.write(line)
        fin.close()
    
    0 讨论(0)
提交回复
热议问题