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

Python 遍历目录,更改分隔符并更改文件扩展名,python,csv,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("

正如标题所述,我正在尝试遍历.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"))
导入csv
导入系统
导入操作系统
如果len(sys.argv)<4:
sys.exit(“用法:将_转换为_psv.py~/dir.tsv.csv”)
其他:
cur_dir=(sys.argv[1])
old_ext=(sys.argv[2])
new_ext=(sys.argv[3])
打印“此处1”
files=os.listdir(cur\u dir)
对于文件中的文件名:
file_ext=os.path.splitext(文件名)[1]
如果old_ext==文件_ext:
newfile=filename.replace(旧的扩展名,新的扩展名)
重命名(文件名,新文件)
csv.字段大小限制(sys.maxsize)
csv.writer(文件(sys.argv[3],'w+',分隔符=“|”).writerows(csv.reader(打开(sys.argv[2]),分隔符=“\t”))

提前谢谢你的帮助

不能同时读写同一个文件;您要么将所有内容读入内存,要么使用单独的输出文件

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

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)
导入csv
导入系统
导入操作系统
如果len(sys.argv)<4:
sys.exit(“用法:将_转换为_psv.py~/dir.tsv.csv”)
其他:
cur_dir,old_ext,new_ext=sys.argv[1:]
对于os.listdir(cur_dir)中的文件名:
filename=os.path.join(cur_dir,filename)
base,file_ext=os.path.splitext(文件名)
如果文件\u ext==旧\u ext:
新文件=基础+新外部
csv.字段大小限制(sys.maxsize)
将open(文件名“rb”)作为ifh,open(新文件“wb”)作为ofh:
reader=csv.reader(ifh,分隔符='\t')
csv.writer(ofh,分隔符=“|”).writerows(reader)
取消链接(文件名)

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

您可能需要
csv.writer(of,delimiter='|').writerows(reader)
。至少在确定它有效之前,最好将
取消链接()谢谢,是的,那是个打字错误。原始版本肯定会破坏数据,所以我们希望OP会进行备份。:-)哈我做的第一件事就是把我的文件复制到一个新目录。谢谢,伙计们。我将在测试后立即报告。因此,我在第14行得到一个错误:open(filename,'rb')作为ifh,open(newfile,'wb')作为ofh:“没有这样的文件或目录:'first.tsv'”。它挂在文件的第一个.tsv上。有什么想法吗?@user2338089:fixed,
os.listdir()
只给出相对名称,而不给出路径。