2013-11-27 30 views
0

正如标题状态,我试图通过是.tsv格式文件的目录走路,我要的分隔符从标签变为“|”并将扩展名更改为.csv。当我运行此命令行,并通过文件路径,旧的延伸和新的扩展(例如,“例如:convert.py C:/用户/ MYDIR /文件.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

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

最简单的方法是不重命名的文件,但写入新的文件名来代替,然后删除旧文件:

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) 

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

+0

你可能想'csv.writer(OFH,分隔符= '|')。writerows(读者)'。也许最好将'unlink()'离开,至少在你确定它可以工作之前。 ;-) – martineau

+0

谢谢,是的,这是一个错字。原始版本肯定会丢失数据,所以我们希望OP能够进行备份。 :-) –

+0

哈!我做的第一件事是将我的文件复制到一个新的目录。感谢帅哥。只要我测试这个,我会立即报告。 – user2338089