Проблема с именованием файлов в Python - PullRequest
0 голосов
/ 24 августа 2011

Я пытаюсь перебрать ряд файлов .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 ]

3 голосов
/ 24 августа 2011

Вместо 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')
2 голосов
/ 24 августа 2011

Я никогда не использовал 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
0 голосов
/ 24 августа 2011

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 может читать ваш файл напрямую :

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

(см. Также здесь )

Чтобы лучше понять, откуда взялся ваш TypeError, оберните ваш код в следующем блоке try / кроме:

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