diff --git a/models/singlevn.obj b/models/singlevn.obj
new file mode 100644
index 00000000..e95807d3
--- /dev/null
+++ b/models/singlevn.obj
@@ -0,0 +1,16 @@
+mtllib surface.mtl
+
+o textureSurface
+v -500.000000 0.000000 500.000000
+v 500.000000 0.000000 500.000000
+v 500.000000 0.000000 -500.000000
+v -500.000000 0.000000 -500.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn 0.0000 1.0000 0.0000
+usemtl Material
+s 1
+f 1/1/1 2/2/1 3/3/1
+f 1/1/1 3/3/1 4/4/1
diff --git a/trimesh/exchange/load.py b/trimesh/exchange/load.py
index e84aec9e..2d38f240 100644
--- a/trimesh/exchange/load.py
+++ b/trimesh/exchange/load.py
@@ -575,6 +575,7 @@ def parse_file_args(file_obj,
     # if we still have no resolver try using file_obj name
     if (resolver is None and
         hasattr(file_obj, 'name') and
+        file_obj.name is not None and
             len(file_obj.name) > 0):
         resolver = visual.resolvers.FilePathResolver(file_obj.name)
 
diff --git a/trimesh/exchange/obj.py b/trimesh/exchange/obj.py
index 978c9060..ea6491fd 100644
--- a/trimesh/exchange/obj.py
+++ b/trimesh/exchange/obj.py
@@ -510,7 +510,7 @@ def _parse_vertices(text):
             for k, v in starts.items() if v >= 0}
 
     # count the number of data values per row on a sample row
-    per_row = {k: len(v[1].split()) for k, v in data.items()}
+    per_row = {k: len(v[0].split()) for k, v in data.items()}
 
     # convert data values into numpy arrays
     result = collections.defaultdict(lambda: None)
diff --git a/trimesh/path/path.py b/trimesh/path/path.py
index f515ee17..8e41c6df 100644
--- a/trimesh/path/path.py
+++ b/trimesh/path/path.py
@@ -102,11 +102,10 @@ class Path(object):
         """
         Print a quick summary of the number of vertices and entities.
         """
-        r = '<trimesh.{}(vertices.shape={}, len(entities)={})>'.format(
+        return '<trimesh.{}(vertices.shape={}, len(entities)={})>'.format(
             type(self).__name__,
             self.vertices.shape,
             len(self.entities))
-        return r
 
     def process(self):
         """
@@ -124,7 +123,8 @@ class Path(object):
 
     @vertices.setter
     def vertices(self, values):
-        self._vertices = caching.tracked_array(values, dtype=np.float64)
+        self._vertices = caching.tracked_array(
+            values, dtype=np.float64)
 
     @property
     def entities(self):
diff --git a/trimesh/version.py b/trimesh/version.py
index ec0a0cc4..257e0a57 100644
--- a/trimesh/version.py
+++ b/trimesh/version.py
@@ -1,1 +1,1 @@
-__version__ = '3.4.6'
+__version__ = '3.4.7'

List Index out of Range when loading .obj
Hi, I am trying to load .obj model that I created with blender but I am having issues. It seems to work fine with .ply or .stl format. The error I keep getting is "Indexerror: list index out of range"

Traceback (most recent call last):
  File ".\pyrenderTest.py", line 14, in <module>
    road = trimesh.load('C:/Users/walit/Downloads/Surface/surface.obj', file_type='OBJ')
  File "C:\Program Files\Python37\lib\site-packages\trimesh\exchange\load.py", line 136, in load
    **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\trimesh\constants.py", line 136, in timed
    result = method(*args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\trimesh\exchange\load.py", line 212, in load_mesh
    **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\trimesh\exchange\obj.py", line 80, in load_obj
    v, vn, vt, vc = _parse_vertices(text=text)
  File "C:\Program Files\Python37\lib\site-packages\trimesh\exchange\obj.py", line 513, in _parse_vertices
    per_row = {k: len(v[1].split()) for k, v in data.items()}
  File "C:\Program Files\Python37\lib\site-packages\trimesh\exchange\obj.py", line 513, in <dictcomp>
    per_row = {k: len(v[1].split()) for k, v in data.items()}
IndexError: list index out of range


Here is my .obj

# Blender v2.80 (sub 75) OBJ File: ''
# www.blender.org
mtllib surface.mtl

o textureSurface
v -500.000000 0.000000 500.000000
v 500.000000 0.000000 500.000000
v 500.000000 0.000000 -500.000000
v -500.000000 0.000000 -500.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.0000 1.0000 0.0000
usemtl Material
s 1
f 1/1/1 2/2/1 3/3/1
f 1/1/1 3/3/1 4/4/1

Thank you in advance for you help!

diff --git a/tests/test_obj.py b/tests/test_obj.py
index 2c0c24b9..cbd6aa66 100644
--- a/tests/test_obj.py
+++ b/tests/test_obj.py
@@ -119,6 +119,14 @@ class OBJTest(g.unittest.TestCase):
         # assert colors have survived the export cycle
         assert (mesh.visual.vertex_colors == rec.visual.vertex_colors).all()
 
+    def test_single_vn(self):
+        """
+        Make sure files with a single VN load.
+        """
+        m = g.get_mesh('singlevn.obj')
+        assert len(m.vertices) > 0
+        assert len(m.faces) > 0
+
 
 if __name__ == '__main__':
     g.trimesh.util.attach_to_log()

pip install -e .[all]
parse_log_pytest
requirements.txt
pytest pytest-cov pyassimp jsonschema coveralls autopep8 flake8
apt-get update apt-get install -y gcc
3.6
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
autopep8==2.0.4
autoprop==4.1.0
backports.cached-property==1.0.2
certifi==2021.5.30
chardet==5.0.0
charset-normalizer==2.0.12
colorlog==6.9.0
coverage==6.2
coveralls==3.3.1
cycler==0.11.0
Cython==3.0.12
decorator==4.4.2
docopt==0.6.2
flake8==2.5.5
glooey==0.3.6
idna==3.10
imageio==2.15.0
importlib-metadata==4.8.3
iniconfig==1.1.1
jsonschema==3.2.0
kiwisolver==1.3.1
lxml==5.3.1
matplotlib==3.3.4
mccabe==0.4.0
more-itertools==8.14.0
mpmath==1.3.0
msgpack==1.0.5
networkx==2.5.1
numpy==1.19.5
packaging==21.3
pep8==1.7.1
Pillow==8.4.0
pluggy==1.0.0
psutil==7.0.0
py==1.11.0
pyassimp==5.2.5
pycodestyle==2.10.0
pycollada==0.8
pyflakes==1.0.0
pyglet==2.0.10
pyparsing==3.1.4
pyrsistent==0.18.0
pytest==7.0.1
pytest-cov==4.0.0
python-dateutil==2.9.0.post0
python-fcl==0.7.0.5
PyWavelets==1.1.1
PyYAML==6.0.1
requests==2.27.1
Rtree==0.9.7
scikit-image==0.17.2
scipy==1.5.4
Shapely==1.8.5.post1
signature_dispatch==1.0.0
six==1.17.0
svg.path==6.2
sympy==1.9
tifffile==2020.9.3
tomli==1.2.3
triangle==20220202
-e git+https://github.com/mikedh/trimesh.git@bf989493ce1919c96b0a904adf37140f10b32894#egg=trimesh
typeguard==2.13.3
typing==3.7.4.3
typing_extensions==4.1.1
urllib3==1.26.20
vecrec==0.3.1
xxhash==3.2.0
zipp==3.6.0

name: trimesh
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - autopep8==2.0.4
      - autoprop==4.1.0
      - backports-cached-property==1.0.2
      - chardet==5.0.0
      - charset-normalizer==2.0.12
      - colorlog==6.9.0
      - coverage==6.2
      - coveralls==3.3.1
      - cycler==0.11.0
      - cython==3.0.12
      - decorator==4.4.2
      - docopt==0.6.2
      - flake8==2.5.5
      - glooey==0.3.6
      - idna==3.10
      - imageio==2.15.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - jsonschema==3.2.0
      - kiwisolver==1.3.1
      - lxml==5.3.1
      - matplotlib==3.3.4
      - mccabe==0.4.0
      - more-itertools==8.14.0
      - mpmath==1.3.0
      - msgpack==1.0.5
      - networkx==2.5.1
      - numpy==1.19.5
      - packaging==21.3
      - pep8==1.7.1
      - pillow==8.4.0
      - pluggy==1.0.0
      - psutil==7.0.0
      - py==1.11.0
      - pyassimp==5.2.5
      - pycodestyle==2.10.0
      - pycollada==0.8
      - pyflakes==1.0.0
      - pyglet==2.0.10
      - pyparsing==3.1.4
      - pyrsistent==0.18.0
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - python-dateutil==2.9.0.post0
      - python-fcl==0.7.0.5
      - pywavelets==1.1.1
      - pyyaml==6.0.1
      - requests==2.27.1
      - rtree==0.9.7
      - scikit-image==0.17.2
      - scipy==1.5.4
      - shapely==1.8.5.post1
      - signature-dispatch==1.0.0
      - six==1.17.0
      - svg-path==6.2
      - sympy==1.9
      - tifffile==2020.9.3
      - tomli==1.2.3
      - triangle==20220202
      - typeguard==2.13.3
      - typing==3.7.4.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - vecrec==0.3.1
      - xxhash==3.2.0
      - zipp==3.6.0
prefix: /opt/conda/envs/trimesh

tests/test_obj.py::OBJTest::test_single_vn
tests/test_obj.py::OBJTest::test_obj_compressed tests/test_obj.py::OBJTest::test_obj_groups tests/test_obj.py::OBJTest::test_obj_multiobj tests/test_obj.py::OBJTest::test_obj_quad tests/test_obj.py::OBJTest::test_obj_simple_order tests/test_obj.py::OBJTest::test_obj_split_attributes tests/test_obj.py::OBJTest::test_rabbit tests/test_obj.py::OBJTest::test_vertex_color
models/singlevn.obj trimesh/exchange/load.py trimesh/path/path.py trimesh/version.py trimesh/exchange/obj.py
models/singlevn.obj trimesh/exchange/load.py trimesh/path/path.py trimesh/version.py trimesh/exchange/obj.py