# File upload of a CSV - csv.DictReader not found?

**URL:** <https://forum.inductiveautomation.com/t/file-upload-of-a-csv-csv-dictreader-not-found/111974>\
**Category:** Ignition\
**Tags:** scripting, perspective\
**Created:** [November 5, 2025, 9:03pm UTC](https://forum.inductiveautomation.com/t/file-upload-of-a-csv-csv-dictreader-not-found/111974 "2025-11-05T21:03:03Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![drewdin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/drewdin/32/3363_2.png) [@drewdin](https://forum.inductiveautomation.com/u/drewdin)\
**Post date:** [November 5, 2025, 9:03pm UTC](https://forum.inductiveautomation.com/t/file-upload-of-a-csv-csv-dictreader-not-found/111974/1 "2025-11-05T21:03:03Z")

</div>

I am using 8.3.1 and the file upload on a perspective page to parse a csv file (standard csv file comma separated), I found plenty of posts on here on how others have done it.

Here’s my simple code on the file received to test as it keeps not liking dict reader, whats right in front of me that I’m missing?

```python
def runAction(self, event):
    import csv
    fileContents = event.file.getString("UTF-8")
    reader = csv.DictReader(StringIO(fileContents))

```

I wanted to use the dict reader functions so I can have dictionaries of the data but it keeps telling me the following error. Seems like it not importing csv? Any suggestions?

```python
java.lang.Throwable: Traceback (most recent call last):
  File "<function:runAction>", line 4, in runAction
AttributeError: 'com.inductiveautomation.ignition.common.script.Pro' object has no attribute 'DictReader'

	at org.python.core.Py.AttributeError(Py.java:176)
	at org.python.core.PyObject.noAttributeError(PyObject.java:965)
	at org.python.core.PyObject. __getattr__ (PyObject.java:959)
	at org.python.pycode._pyx537.runAction$1(<function:runAction>:5)
	at org.python.pycode._pyx537.call_function(<function:runAction>)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
	at org.python.core.PyFunction.function ___call__ (PyFunction.java:474)
	at org.python.core.PyFunction. __call__ (PyFunction.java:469)
	at org.python.core.PyFunction. __call__ (PyFunction.java:464)
	at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:851)
	at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:833)
	at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$TrackingProjectScriptManager.runFunction(ProjectScriptLifecycle.java:1167)
	at com.inductiveautomation.ignition.common.script.ScriptManager$ScriptFunctionImpl.invoke(ScriptManager.java:1003)
	at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$AutoRecompilingScriptFunction.invoke(ProjectScriptLifecycle.java:1249)
	at com.inductiveautomation.perspective.gateway.script.SessionScriptFunctionHelper.execute(SessionScriptFunctionHelper.java:98)
	at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:103)
	at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:70)
	at com.inductiveautomation.perspective.gateway.action.ScriptAction.runAction(ScriptAction.java:80)
	at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.lambda$call$0(ActionCollection.java:262)
	at com.inductiveautomation.perspective.gateway.api.LoggingContext.mdc(LoggingContext.java:54)
	at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:251)
	at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:220)
	at com.inductiveautomation.perspective.gateway.threading.BlockingTaskQueue$TaskWrapper.run(BlockingTaskQueue.java:154)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at com.inductiveautomation.perspective.gateway.threading.BlockingWork$BlockingWorkRunnable.run(BlockingWork.java:58)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Throwable: AttributeError: 'com.inductiveautomation.ignition.common.script.Pro' object has no attribute 'DictReader'
	... 30 more

Ignition v8.3.1 (b2025102109)
Java: Azul Systems, Inc. 17.0.16

```

---

<div class="post-metadata">

**Author:** ![drewdin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/drewdin/32/3363_2.png) [@drewdin](https://forum.inductiveautomation.com/u/drewdin)\
**Post date:** [November 5, 2025, 10:26pm UTC](https://forum.inductiveautomation.com/t/file-upload-of-a-csv-csv-dictreader-not-found/111974/2 "2025-11-05T22:26:30Z")

</div>

I tried using from csv import DictReader and got the following error. Any suggestions?

```python
java.lang.Throwable: Traceback (most recent call last):
  File "<function:runAction>", line 2, in runAction
ImportError: cannot import name DictReader

	at org.python.core.Py.ImportError(Py.java:327)
	at org.python.core.imp.importFromAs(imp.java:1648)
	at org.python.core.imp.importFrom(imp.java:1611)
	at org.python.pycode._pyx560.runAction$1(<function:runAction>:4)
	at org.python.pycode._pyx560.call_function(<function:runAction>)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
	at org.python.core.PyFunction.function ___call__ (PyFunction.java:474)
	at org.python.core.PyFunction. __call__ (PyFunction.java:469)
	at org.python.core.PyFunction. __call__ (PyFunction.java:464)
	at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:851)
	at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:833)
	at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$TrackingProjectScriptManager.runFunction(ProjectScriptLifecycle.java:1167)
	at com.inductiveautomation.ignition.common.script.ScriptManager$ScriptFunctionImpl.invoke(ScriptManager.java:1003)
	at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$AutoRecompilingScriptFunction.invoke(ProjectScriptLifecycle.java:1249)
	at com.inductiveautomation.perspective.gateway.script.SessionScriptFunctionHelper.execute(SessionScriptFunctionHelper.java:98)
	at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:103)
	at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:70)
	at com.inductiveautomation.perspective.gateway.action.ScriptAction.runAction(ScriptAction.java:80)
	at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.lambda$call$0(ActionCollection.java:262)
	at com.inductiveautomation.perspective.gateway.api.LoggingContext.mdc(LoggingContext.java:54)
	at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:251)
	at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:220)
	at com.inductiveautomation.perspective.gateway.threading.BlockingTaskQueue$TaskWrapper.run(BlockingTaskQueue.java:154)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at com.inductiveautomation.perspective.gateway.threading.BlockingWork$BlockingWorkRunnable.run(BlockingWork.java:58)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Throwable: ImportError: cannot import name DictReader
	... 30 common frames omitted

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [November 5, 2025, 10:28pm UTC](https://forum.inductiveautomation.com/t/file-upload-of-a-csv-csv-dictreader-not-found/111974/3 "2025-11-05T22:28:41Z")

</div>

> [@drewdin](#):
>
> `Caused by: java.lang.Throwable: AttributeError: 'com.inductiveautomation.ignition.common.script.Pro' object has no attribute 'DictReader'`

Do you have a project script library named `csv` by chance?

---

<div class="post-metadata">

**Author:** ![drewdin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/drewdin/32/3363_2.png) [@drewdin](https://forum.inductiveautomation.com/u/drewdin)\
**Post date:** [November 5, 2025, 10:29pm UTC](https://forum.inductiveautomation.com/t/file-upload-of-a-csv-csv-dictreader-not-found/111974/4 "2025-11-05T22:29:57Z")

</div>

I do, and I am changing it now!

---

<div class="post-metadata">

**Author:** ![drewdin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/drewdin/32/3363_2.png) [@drewdin](https://forum.inductiveautomation.com/u/drewdin)\
**Post date:** [November 5, 2025, 10:45pm UTC](https://forum.inductiveautomation.com/t/file-upload-of-a-csv-csv-dictreader-not-found/111974/5 "2025-11-05T22:45:37Z")

</div>

rookie mistake! i appreciate it!
