TypeError: 'in <string>' requires string as left operand, not Element

V

Victor Hooi

Hi,

I'm getting a strange error when I try to run the following:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity' not in file:
print(root)
print(file)
with open(os.path.join(root, file), 'r') as f:
print(f.name)
try:
tree = etree.parse(f)
root = tree.getroot()
print(f.name)
print(root.tag)
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name, e.message))

The error is:

Traceback (most recent call last):
File "foo.py", line 275, in <module>
marketlink_configfiles()
File "foo.py", line 83, in bar
with open(os.path.join(root, file), 'r') as f:
File "C:\Python27\lib\ntpath.py", line 97, in join
if path[-1] in "/\\":
TypeError: 'in <string>' requires string as left operand, not Element

Cheers,
Victor
 
R

Roy Smith

Victor Hooi said:
Hi,

I'm getting a strange error when I try to run the following:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity'
not in file:
print(root)
print(file)
with open(os.path.join(root, file), 'r') as f:
print(f.name)
try:
tree = etree.parse(f)
root = tree.getroot()
print(f.name)
print(root.tag)
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name,
e.message))

The error is:

Traceback (most recent call last):
File "foo.py", line 275, in <module>
marketlink_configfiles()
File "foo.py", line 83, in bar
with open(os.path.join(root, file), 'r') as f:
File "C:\Python27\lib\ntpath.py", line 97, in join
if path[-1] in "/\\":
TypeError: 'in <string>' requires string as left operand, not Element

Cheers,
Victor

The first thing I would do is try to figure out if it's happening in the
join() or the open(). Try refactoring this as:
temp = os.path.join(root, file)
with open(temp, 'r') as f:

and see which line generates the exception. I'm guessing it's the
join(), but it helps to make sure (so you don't go down some rabbit
hole). Next, I would try to construct a minimal test case. Keep
hacking away code until you get down to the smallest thing which is
produce the problem. I'm guessing something like:
for root, dirs, files in os.walk('./'):
for file in files:
os.path.join(root, file)

might do it. Hopefully that will narrow things down a bit.
 
V

Victor Hooi

Hi,

Ignore me - PEBKAC...lol.

I used "root" both for the os.walk, and also for the root XML element.

Thanks anyhow =).

Cheers,
Victor
 
D

Dave Angel

Hi,

I'm getting a strange error when I try to run the following:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity' not in file:
print(root)
print(file)
with open(os.path.join(root, file), 'r') as f:
print(f.name)
try:
tree = etree.parse(f)
root = tree.getroot()
print(f.name)
print(root.tag)
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name, e.message))

Where's the printout of the root and file variables? You're asking
os.path.join to work on them, and it's clearly upset about their types.
I see print statements, so you clearly were thinking along these lines.
But you don't show them. BTW, I'd be using print(repr(root)) and
print(repr(file)) instead, so you get a better idea of their type and value.

My guess for the problem is that you're trashing 'root' with the
contents of your try block. Try using a different name for the xml stuff.
The error is:

Traceback (most recent call last):
File "foo.py", line 275, in <module>
marketlink_configfiles()
File "foo.py", line 83, in bar
with open(os.path.join(root, file), 'r') as f:
File "C:\Python27\lib\ntpath.py", line 97, in join
if path[-1] in "/\\":
TypeError: 'in <string>' requires string as left operand, not Element

Cheers,
Victor

Incidentally, 'file' is a builtin type, so it's probably not a good idea
to hide it by using it as your own local variable.
 
M

MRAB

Hi,

I'm getting a strange error when I try to run the following:

for root, dirs, files in os.walk('./'):
for file in files:
if file.startswith('ml') and file.endswith('.xml') and 'entity' not in file:
print(root)
print(file)
with open(os.path.join(root, file), 'r') as f:
print(f.name)
try:
tree = etree.parse(f)
root = tree.getroot()
print(f.name)
print(root.tag)
except xml.parsers.expat.ExpatError as e:
print('Unable to parse file {0} - {1}'.format(f.name, e.message))

Where's the printout of the root and file variables? You're asking
os.path.join to work on them, and it's clearly upset about their types.
I see print statements, so you clearly were thinking along these lines.
But you don't show them. BTW, I'd be using print(repr(root)) and
print(repr(file)) instead, so you get a better idea of their type and value.

My guess for the problem is that you're trashing 'root' with the
contents of your try block. Try using a different name for the xml stuff.
The error is:

Traceback (most recent call last):
File "foo.py", line 275, in <module>
marketlink_configfiles()
File "foo.py", line 83, in bar
with open(os.path.join(root, file), 'r') as f:
File "C:\Python27\lib\ntpath.py", line 97, in join
if path[-1] in "/\\":
TypeError: 'in <string>' requires string as left operand, not Element

Cheers,
Victor

Incidentally, 'file' is a builtin type, so it's probably not a good idea
to hide it by using it as your own local variable.
It looks like Python 3 to me, which doesn't define 'file'.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top