如何通过csv.DictWriter将csv.DictReader JSON结构写回TSV文件?

如何通过csv.DictWriter将csv.DictReader JSON结构写回TSV文件?,json,python-3.x,csv,dictionary,Json,Python 3.x,Csv,Dictionary,我正在创建一个python(Flask)应用程序,该应用程序将部署到生产中的只读文件系统中。总的来说,此应用程序旨在: 在包装python脚本(main.py)中将.TSV解析为字典列表(使用csv.DictReader) 将该列表转换为JSON结构(仍然是main.py) 将此JSON结构作为命令行中的参数传递给另一个python脚本(author script.py)(因为我无法在生产中本地保存.TSV文件) 解析JSON结构并写入内存中的临时TSV文件(现在位于author script.

我正在创建一个python(Flask)应用程序,该应用程序将部署到生产中的只读文件系统中。总的来说,此应用程序旨在:

  • 在包装python脚本(
    main.py
    )中将.TSV解析为字典列表(使用
    csv.DictReader
  • 将该列表转换为JSON结构(仍然是
    main.py
  • 将此JSON结构作为命令行中的参数传递给另一个python脚本(
    author script.py
    )(因为我无法在生产中本地保存.TSV文件)
  • 解析JSON结构并写入内存中的临时TSV文件(现在位于
    author script.py
  • 处理该TSV文件以生成HTML文件作为结果(
    author script.py
  • 对于步骤4),我希望
    author script.py
    脚本最终像.TSV文件一样通过
    csv.DictWriter
    解析这个JSON结构。这是因为,最初,
    author script.py
    被设置为解析TSV文件,修改它以解析词典需要花费太长时间

    目前,我的方法是从JSON结构回溯到字典,然后通过
    csv.DictWriter
    写出这些字典。下面是我的尝试(就像我在
    author script.py
    中开始解析JSON结构参数一样进行演示):

    我得到的错误是
    TypeError:类型为'NoneType'的参数不可编辑
    。如果我在同一个脚本中有
    csv.DictReader
    对象,我知道如何实现这一点,但在这种情况下,我不会有它

    我的问题是

  • 如何准确地从JSON-->字典-->DictReader对象-->DictWriter-->TSV文件转换
  • 如何写入内存中的.TSV文件
  • 更新

    当我通过将
    csv.DictReader
    对象放在同一代码中来测试以下方法时,
    csv.DictWriter
    方法显然工作良好,并在内存中打印出原始TSV中的TSV文件。但是,当我实现@martineau的解决方案时,列以混乱的方式输出

    infile = open("/Users/cdastmalchi/Downloads/Author_Template.tsv")
    
    contents = csv.DictReader(infile, delimiter='\t')
    memory_file = io.StringIO()
    
    writer = csv.DictWriter(memory_file, fieldnames=contents.fieldnames, delimiter='\t')
    for row in contents:
        writer.writerow(row)
    
    as_string = memory_file.getvalue()
    print('\n'.join(as_string.splitlines()))
    

    之所以出现此错误,是因为在
    csv.DictWriter()
    调用中有
    fieldnames=None
    。您可以从
    contents
    列表中第一个字典的键中获取字段名

    TSV文件可以使用类写入内存


    如果文件很大,您可能无法将其作为命令行参数传递。

    谢谢您的反馈!当我尝试上述操作时,我得到了错误:
    Traceback(最后一次调用):writerows.writerows(contents)文件/Users/cdastmalchi/miniconda2/lib/python2.7/csv.py中的文件“test_csv.py”,第20行,writerows返回self.writerows(rows)类型错误:需要unicode参数,获取了“str”
    @claudiadast:看起来您正在使用Python 2。我回答中的代码是为Python3.x编写的。你应该把你的问题标记为“python-2.x”。啊,是的,你是对的!它与Python3一起工作。唯一的问题是这些列都是混乱的up@claudiadast:如果您想提问,请将问题标记为“python-3.x”。显然这很重要。请看我的更新。我正要将您的答案标记为正确答案,但我仍然存在一个问题,即如果我在更新中使用代码,列的顺序将与原始顺序不同。(不幸的是,在我的例子中,DictReader和DictWriter对象不能在同一个脚本中)。
    infile = open("/Users/cdastmalchi/Downloads/Author_Template.tsv")
    
    contents = csv.DictReader(infile, delimiter='\t')
    memory_file = io.StringIO()
    
    writer = csv.DictWriter(memory_file, fieldnames=contents.fieldnames, delimiter='\t')
    for row in contents:
        writer.writerow(row)
    
    as_string = memory_file.getvalue()
    print('\n'.join(as_string.splitlines()))
    
    from ast import literal_eval
    import csv
    import json
    import io
    from pprint import pprint
    
    # This is the JSON structure that's passed to the python script
    infile = '"[{\\"Manuscript preparation\\": \\"Y\\", \\"First_Name\\": \\"Anna\\", \\"Last_Name\\": \\"Karenina\\", \\"Tel\\": \\"8885006000\\", \\"Data generation\\": \\"Y\\", \\"Places\\": \\"BioInform_Harvard\\", \\"Fax\\": \\"8885006001\\", \\"Experimental design\\": \\"Y\\", \\"Joint\\": \\"1\\", \\"Data analysis\\": \\"Y\\", \\"Statistical analysis\\": \\"Y\\", \\"Data processing\\": \\"Y\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"anna.Karenina@ucsf.edu\\", \\"Initials\\": \\"A\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"Konstantin\\", \\"Last_Name\\": \\"Levin\\", \\"Tel\\": \\"8887006000\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"Neuro_Harvard\\", \\"Fax\\": \\"8887006001\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"1\\", \\"Data analysis\\": \\"Y\\", \\"Statistical analysis\\": \\"Y\\", \\"Data processing\\": \\"Y\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"Konstantin.levin@childrens.harvard.edu\\", \\"Initials\\": \\"D\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"Alexei\\", \\"Last_Name\\": \\"Vronsky\\", \\"Tel\\": \\"8889006000\\", \\"Data generation\\": \\"Y\\", \\"Places\\": \\"IGM_Columbia\\", \\"Fax\\": \\"8889006001\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"2\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"alexei.vronsky@cumc.columbia.edu\\", \\"Initials\\": \\"K\\"}, {\\"Manuscript preparation\\": \\"Y\\", \\"First_Name\\": \\"Stepan\\", \\"Last_Name\\": \\"Oblonsky\\", \\"Tel\\": \\"8891006000\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"NIMH\\", \\"Fax\\": \\"8891006001\\", \\"Experimental design\\": \\"Y\\", \\"Joint\\": \\"2\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"steoblon@mail.nih.gov\\", \\"Initials\\": \\"A\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"Ekaterina\\", \\"Last_Name\\": \\"Shcherbatskaya\\", \\"Tel\\": \\"8893006000\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"CHU_Montreal\\", \\"Fax\\": \\"8893006001\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"Y\\", \\"Statistical analysis\\": \\"Y\\", \\"Data processing\\": \\"Y\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"Ekaterina.Shcherbatskaya@umontreal.ca\\", \\"Initials\\": \\"A\\"}, {\\"Manuscript preparation\\": \\"Y\\", \\"First_Name\\": \\"Alexei\\", \\"Last_Name\\": \\"Karenin\\", \\"Tel\\": \\"8895006000\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"BioInform_Harvard, Neuro_Harvard\\", \\"Fax\\": \\"8895006001\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"Y\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"Karenin05@hms.harvard.edu\\", \\"Initials\\": \\"A\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"Fyodor\\", \\"Last_Name\\": \\"Dostoevsky\\", \\"Tel\\": \\"8897006000\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"Penn_Psych\\", \\"Fax\\": \\"8897006001\\", \\"Experimental design\\": \\"Y\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"Y\\", \\"Email\\": \\"Fyodor_Dostoevsky@pennmedicine.upenn.edu\\", \\"Initials\\": \\"M\\"}, {\\"Manuscript preparation\\": \\"Y\\", \\"First_Name\\": \\"Lev\\", \\"Last_Name\\": \\"Tolstoy\\", \\"Tel\\": \\"8899006000\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"UCSF_Weill\\", \\"Fax\\": \\"8899006001\\", \\"Experimental design\\": \\"Y\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"Y\\", \\"Statistical analysis\\": \\"Y\\", \\"Data processing\\": \\"Y\\", \\"Corresponding\\": \\"Y\\", \\"Email\\": \\"ltolstoy@mednet.ucla.edu\\", \\"Initials\\": \\"N\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"Place\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"Address\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"BioInform_Harvard\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"Department of Biomedical Informatics, Harvard Medical School, Boston, MA, USA\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"CHU_Montreal\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"CHU Sainte-Justine Research Centre, University of Montreal, 3175 Chemin de la Co_te-Sainte-Catherine, Montreal, Quebec H3T 1C5, Canada.\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"IGM_Columbia\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"Institute for Genomic Medicine, Columbia University Medical Center, Hammer Health Sciences, 1408, 701 West 168th St., New York, NY 10032, USA.\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"Neuro_Harvard\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"Department of Neurology, Boston Children\'s Hospital and Harvard Medical School, Boston, MA, USA\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"NIMH\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"National Institute of Mental Health, 10 Center Dr, Bethesda, MD 20814\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"Penn_Psych\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"Department of Psychiatry, Neuropsychiatry Section, Perelman School of Medicine at the University of Pennsylvania, 3400 Spruce, Philadelphia, PA 19104\\"}, {\\"Manuscript preparation\\": \\"\\", \\"First_Name\\": \\"UCSF_Weill\\", \\"Last_Name\\": \\"\\", \\"Tel\\": \\"\\", \\"Data generation\\": \\"\\", \\"Places\\": \\"\\", \\"Fax\\": \\"\\", \\"Experimental design\\": \\"\\", \\"Joint\\": \\"\\", \\"Data analysis\\": \\"\\", \\"Statistical analysis\\": \\"\\", \\"Data processing\\": \\"\\", \\"Corresponding\\": \\"\\", \\"Email\\": \\"\\", \\"Initials\\": \\"Department of Psychiatry, UCSF Weill Institute for Neurosciences, University of California, San Francisco, San Francisco, CA 94158\\"}]"'
    
    # Convert json string that's passed to script into literal list of dicts
    contents = json.loads(literal_eval(infile))
    fieldnames = contents[0].keys()  # Get TSV fieldnames from first dictionary.
    
    # Put list of dicts back into TSV "file" in memory
    memory_file = io.StringIO()
    writer = csv.DictWriter(memory_file, fieldnames=fieldnames, delimiter='\t')
    writer.writerows(contents)
    
    as_string = memory_file.getvalue()
    print('\n'.join(as_string.splitlines()))