Python的文件命名问题

时间:2011-08-24 15:29:42

标签: python mkdir

我正在尝试遍历数字.rtf文件和每个文件:读取文件,执行一些操作,然后将新文件作为与原始文件同名的纯文本文件写入子目录,但是使用.txt扩展名。我遇到的问题是文件命名。

如果文件名为foo.rtf,我希望子目录中的新文件为foo.txt。这是我的代码:

import glob
import os
import numpy as np


dir_path = '/Users/me/Desktop/test/'
file_suffix = '*.rtf'
output_dir = os.mkdir('sub_dir')
for item in glob.iglob(dir_path + file_suffix):
    with open(item, "r") as infile:
        reader = infile.readlines()
        matrix = []
        for row in reader:
            row = str(row)
            row = row.split()
            row = [int(value) for value in row]
            matrix.append(row)
        np_matrix = np.array(matrix)
        inv_matrix = np.transpose(np_matrix)
        new_file_name = item.replace('*.rtf', '*.txt') # i think this line is the problem?
        os.chdir(output_dir)
        with open(new_file_name, mode="w") as outfile:
            outfile.write(inv_matrix)

当我运行此代码时,我收到类型错误:

  

TypeError:强制转换为Unicode:需要字符串或缓冲区,找到NoneType

如何修复我的代码以将新文件写入子目录并将文件扩展名从.rtf更改为.txt?谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

而不是item.replace,请查看os.path模块(http://docs.python.org/library/os.path.html)中的一些功能。它们是为了拆分和重新组合文件名的一部分而制作的。例如,os.path.splitext会将文件名拆分为文件路径和文件扩展名。

假设您有一个文件/tmp/foo.rtf,并且您希望将其移至/tmp/foo.txt

old_file = '/tmp/foo.rtf'
(file,ext) = os.path.splitext(old_file)
print 'File=%s Extension=%s' % (file,ext)
new_file = '%s%s' % (file,'.txt')
print 'New file = %s' % (new_file)

或者如果你想要一行版本:

old_file = '/tmp/foo.rtf'
new_file = '%s%s' % (os.path.splitext(old_file)[0],'.txt')

答案 1 :(得分:2)

我从未使用过glob,但是这里是一种不使用模块的替代方法:
您可以使用

轻松删除后缀
name = name[:name.rfind('.')]

然后添加新后缀:

name = name + '.txt'

为什么不使用功能?

def change_suffix(string, new_suffix):
    i = string.rfind('.')
    if i < 0:
        raise ValueError, 'string does not have a suffix'
    if not new_suffix[0] == '.':
        new_suffix += '.'
    return string[:i] + new_suffix

答案 2 :(得分:0)

glob.iglob()产生路径名,没有字符'*'。 因此你的行应该是:

new_file_name = item.replace('.rtf', '.txt') 

考虑使用更清晰的名称(为文件名保留'filename'并使用'path'作为文件的完整路径;使用'path_original'而不是'item'),os.extsep('。'在Windows中)和os.path.splitext():

path_txt = os.extsep.join([os.path.splitext(path_original)[0], 'txt'])

现在是最好的暗示: numpy可能read your file directly

data = np.genfromtxt(filename, unpack=True)

(另见here

为了更好地了解TypeError的来源,请将代码包装在以下try / except块中:

try:
    (your code)
except:
    import traceback
    traceback.print_exc()