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

Dave Angel d at davea.name
Mon Dec 10 02:19:30 CET 2012


On 12/09/2012 07:52 PM, Victor Hooi wrote:
> 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.

-- 

DaveA




More information about the Python-list mailing list