Erica
Erica

Reputation: 201

"ValueError: embedded null character" when using open()

I am taking python at my college and I am stuck with my current assignment. We are supposed to take 2 files and compare them. I am simply trying to open the files so I can use them but I keep getting the error "ValueError: embedded null character"

file1 = input("Enter the name of the first file: ")
file1_open = open(file1)
file1_content = file1_open.read()

What does this error mean?

Upvotes: 20

Views: 119944

Answers (10)

Viraj Patel
Viraj Patel

Reputation: 27

Instead of this D:\path\0.html try this D:/path/0.html Reason of error is python interpret \0 instead of path string.

Upvotes: 1

kamakshi singh
kamakshi singh

Reputation: 11

I was also getting the same error with the following code:

with zipfile.ZipFile("C:\local_files\REPORT.zip",mode='w') as z:
    z.writestr(data)

It was happening because I was passing the bytestring i.e. data in writestr() method without specifying the name of file i.e. Report.zip where it should be saved. So I changed my code and it worked.

with zipfile.ZipFile("C:\local_files\REPORT.zip",mode='w') as z:
    z.writestr('Report.zip', data)

Upvotes: 1

srinivasan dasarathi
srinivasan dasarathi

Reputation: 51

On Windows while specifying the full path of the file name, we should use double backward slash as the seperator and not single backward slash. For instance, C:\\FileName.txt instead of C:\FileName.txt

Upvotes: 5

Rahul Pandey
Rahul Pandey

Reputation: 191

Try putting r (raw format).

r'D:\python_projects\templates\0.html'

Upvotes: 7

abc
abc

Reputation: 3561

The first slash of the file path name throws the error.

Need Raw, r
Raw string

FileHandle = open(r'..', encoding='utf8')

FilePath='C://FileName.txt'
FilePath=r'C:/FileName.txt'

Upvotes: 2

yunusemredemirbas
yunusemredemirbas

Reputation: 152

I got this error when copying a file to a folder that starts with a number. If you write the folder path with the double \ sign before the number, the problem will be solved.

Upvotes: 2

The problem is due to bytes data that needs to be decoded.

When you insert a variable into the interpreter, it displays it's repr attribute whereas print() takes the str (which are the same in this scenario) and ignores all unprintable characters such as: \x00, \x01 and replaces them with something else.

A solution is to "decode" file1_content (ignore bytes):

file1_content = ''.join(x for x in file1_content if x.isprintable())

Upvotes: 1

Sabito
Sabito

Reputation: 5075

If you are trying to open a file then you should use the path generated by os, like so:

import os
os.path.join("path","to","the","file")

Upvotes: -1

It seems that you have problems with characters "\" and "/". If you use them in input - try to change one to another...

Upvotes: 22

stonebig
stonebig

Reputation: 1191

Default encoding of files for Python 3.5 is 'utf-8'.

Default encoding of files for Windows tends to be something else.

If you intend to open two text files, you may try this:

import locale
locale.getdefaultlocale()
file1 = input("Enter the name of the first file: ")
file1_open = open(file1, encoding=locale.getdefaultlocale()[1])
file1_content = file1_open.read()

There should be some automatic detection in the standard library.

Otherwise you may create your own:

def guess_encoding(csv_file):
    """guess the encoding of the given file"""
    import io
    import locale
    with io.open(csv_file, "rb") as f:
        data = f.read(5)
    if data.startswith(b"\xEF\xBB\xBF"):  # UTF-8 with a "BOM"
        return "utf-8-sig"
    elif data.startswith(b"\xFF\xFE") or data.startswith(b"\xFE\xFF"):
        return "utf-16"
    else:  # in Windows, guessing utf-8 doesn't work, so we have to try
        try:
            with io.open(csv_file, encoding="utf-8") as f:
                preview = f.read(222222)
                return "utf-8"
        except:
            return locale.getdefaultlocale()[1]

and then

file1 = input("Enter the name of the first file: ")
file1_open = open(file1, encoding=guess_encoding(file1))
file1_content = file1_open.read()

Upvotes: 8

Related Questions