我正在尝试遍历数字.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?谢谢你的帮助。
答案 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()