遍历目录,更改分隔符并更改文件扩展名

时间:2013-11-27 17:42:30

标签: python csv

正如标题所述,我正在尝试遍历.tsv文件目录,我想将分隔符从tab更改为“|”并将扩展名更改为.csv。当我从命令行运行它并传入文件路径,旧扩展和新扩展(例如“例如:convert.py C:/ Users / MyDir / files .tsv .csv”)时,我收到错误:“WindowsError: [错误2]系统找不到指定的文件“。

这是我目前的代码:

import csv
import sys
import os

if len(sys.argv) < 4:
     sys.exit("Usage: convert_to_psv.py ~/dir .tsv .csv")
else:    
     cur_dir = (sys.argv[1])
     old_ext = (sys.argv[2])
     new_ext = (sys.argv[3])
     print "here1"
     files = os.listdir(cur_dir)
     for filename in files:
         file_ext = os.path.splitext(filename)[1]
         if old_ext == file_ext:
             newfile = filename.replace(old_ext, new_ext)
             os.rename(filename, newfile)
             csv.field_size_limit(sys.maxsize)
             csv.writer(file(sys.argv[3], 'w+'), delimiter="|").writerows(csv.reader(open(sys.argv[2]), delimiter="\t"))

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您无法同时读取和写入同一文件;你要么必须将所有内容都读入内存,要么使用单独的输出文件。

最简单的方法是重命名文件,而是写入新文件名,然后删除旧文件:

import csv
import sys
import os

if len(sys.argv) < 4:
     sys.exit("Usage: convert_to_psv.py ~/dir .tsv .csv")
else:    
     cur_dir, old_ext, new_ext = sys.argv[1:]
     for filename in os.listdir(cur_dir):
         filename = os.path.join(cur_dir, filename)
         base, file_ext = os.path.splitext(filename)
         if file_ext == old_ext:
             newfile = base + new_ext
             csv.field_size_limit(sys.maxsize)
             with open(filename, 'rb') as ifh, open(newfile, 'wb') as ofh:
                 reader = csv.reader(ifh, delimiter='\t')
                 csv.writer(ofh, delimiter='|').writerows(reader)
             os.unlink(filename)

请注意,这不一定会创建具有相同权限的新文件。