Bezdepbonusu7Программирование: статьи и ответы

Вопрос

TypeError: принуждение к Unicode: нужна строка или буфер

Автор вопроса: madkittyОтветов: 4

Этот код возвращает следующее сообщение об ошибке:

  • с open (infile, mode = 'r', buffering = -1) как in_f, open (outfile, mode = 'w', buffering = -1) как out_f: TypeError: приведение к Unicode: требуется строка или буфер, файл найден

    # Opens each file to read/modify
    infile=open('110331_HS1A_1_rtTA.result','r')
    outfile=open('2.txt','w')
    
    import re
    
    with open (infile, mode='r', buffering=-1) as in_f, open (outfile, mode='w', buffering=-1) as out_f:
        f = (i for i in in_f if i.rstrip())
        for line in f:
            _, k = line.split('\t',1)
            x = re.findall(r'^1..100\t([+-])chr(\d+):(\d+)\.\.(\d+).+$',k)
            if not x:
                continue
            out_f.write(' '.join(x[0]) + '\n')
    

Пожалуйста, помогите мне.

pythonstringtypeerror

Ответы

Ответ 1 · рейтинг 69 · Gareth Rees

Вы пытаетесь открыть каждый файл дважды! Сначала вы делаете:

infile=open('110331_HS1A_1_rtTA.result','r')

а затем вы снова передаете infile (который является файловым объектом) функции open:

with open (infile, mode='r', buffering=-1)

open, конечно, ожидает, что его первым аргументом будет имя файла, а не открытый файл!

Откройте файл только один раз, и все будет в порядке.

Ответ 2 · рейтинг 10 · Eran

Для менее конкретного случая (не только кода в вопросе - поскольку это один из первых результатов в Google для этого общего сообщения об ошибке. Эта ошибка также возникает при выполнении определенной команды os с аргументом None.

Например:

os.path.exists(arg)
os.stat(arg)

Будет вызывать это исключение, если arg равен None.

Ответ 3 · рейтинг 8 · JAB

Вы пытаетесь передать файловые объекты как имена файлов. Попробуйте использовать

infile = '110331_HS1A_1_rtTA.result'
outfile = '2.txt'

вверху вашего кода.

(Двойное использование open() не только вызывает проблему с попыткой снова открыть файл, это также означает, что infile и outfile никогда не закрываются во время выполнения, хотя они, вероятно, закроются после завершения программы.)

Ответ 4 · рейтинг 1 · Display name

Вот лучший способ, который я нашел для Python 2:

def inplace_change(file,old,new):
        fin = open(file, "rt")
        data = fin.read()
        data = data.replace(old, new)
        fin.close()

        fin = open(file, "wt")
        fin.write(data)
        fin.close()

Пример:

inplace_change('/var/www/html/info.txt','youtub','youtube')

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы