【问题标题】:Split large CSV and Remove Column拆分大型 CSV 并删除列
【发布时间】:2016-02-04 17:33:50
【问题描述】:

我正在使用此代码拆分一个大的 CSV 文件。这完美无缺,但是我想知道如何调整以从输出文件中删除一列?我正在根据第 2 列中的值拆分我的 csv,并且只希望返回第 1 列。

#!/usr/bin/env python3
import binascii
import csv
import os.path
import sys
from tkinter.filedialog import askopenfilename, askdirectory
from tkinter.simpledialog import askinteger

def split_csv_file(f, dst_dir, keyfunc):
    csv_reader = csv.reader(f)
    csv_writers = {}
    for row in csv_reader:
        k = keyfunc(row)
        if k not in csv_writers:
            csv_writers[k] = csv.writer(open(os.path.join(dst_dir, k),
                                             mode='w', newline=''))
        csv_writers[k].writerow(row)

def get_args_from_cli():
    input_filename = sys.argv[1]
    column = int(sys.argv[2])
    dst_dir = sys.argv[3]
    return (input_filename, column, dst_dir)

def get_args_from_gui():
    input_filename = askopenfilename(
        filetypes=(('CSV', '.csv'),),
        title='Select CSV Input File')
    column = askinteger('Choose Table Column', 'Table column')
    dst_dir = askdirectory(title='Select Destination Directory')
    return (input_filename, column, dst_dir)

if __name__ == '__main__':
    if len(sys.argv) == 1:
        input_filename, column, dst_dir = get_args_from_gui()
    elif len(sys.argv) == 4:
        input_filename, column, dst_dir = get_args_from_cli()
    else:
        raise Exception("Invalid number of arguments")
    with open(input_filename, mode='r', newline='') as f:
        split_csv_file(f, dst_dir, lambda r: r[column-1]+'.csv')
        # if the column has funky values resulting in invalid filenames
        # replace the line from above with:
        # split_csv_file(f, dst_dir, lambda r: binascii.b2a_hex(r[column-1].encode('utf-8')).decode('utf-8')+'.csv')

这里是开始 CSV 的示例

"<option value="""">Choose Year</option>",ParentID
"<option value=""Civic1990"">1990</option>",Civic
"<option value=""CRX1990"">1990</option>",CRX
"<option value=""Prelude1990"">1990</option>",Prelude
"<option value=""Accord1990"">1990</option>",Accord
"<option value=""Prelude1991"">1991</option>",Prelude
"<option value=""Civic1991"">1991</option>",Civic
"<option value=""CRX1991"">1991</option>",CRX
"<option value=""Accord1991"">1991</option>",Accord
"<option value=""Prelude1992"">1992</option>",Prelude
"<option value=""Civic1992"">1992</option>",Civic
"<option value=""Accord1992"">1992</option>",Accord
"<option value=""Prelude1993"">1993</option>",Prelude
"<option value=""Civic1993"">1993</option>",Civic
"<option value=""CivicdelSol1993"">1993</option>",CivicdelSol
"<option value=""Accord1993"">1993</option>",Accord
"<option value=""Passport1994"">1994</option>",Passport

完成后,我希望结果看起来像:

<option value="">Choose Year</option>
<option value="Civic1990">1990</option>
<option value="Civic1991">1991</option>
<option value="Civic1992">1992</option>
<option value="Civic1993">1993</option>
<option value="Civic1994">1994</option>
<option value="Civic1995">1995</option>
<option value="Civic1996">1996</option>
<option value="Civic1997">1997</option>
<option value="Civic1998">1998</option>


<option value="">Choose Year</option>
<option value="Accord1990">1990</option>
<option value="Accord1991">1991</option>
<option value="Accord1992">1992</option>
<option value="Accord1993">1993</option>
<option value="Accord1994">1994</option>
<option value="Accord1995">1995</option>
<option value="Accord1996">1996</option>
<option value="Accord1997">1997</option>
<option value="Accord1998">1998</option>

等等... 所以特定模型的每一年和选项值都在他们自己的 csv 或 txt 文件中。

【问题讨论】:

  • 您可以发布您的 csv 文件的样本吗?和预期的输出样本?

标签: python csv


【解决方案1】:

这些行只是 Python 字符串的列表,所以试试:

csv_writers[k].writerow(row[0:1])

这只会写第一列。

第二个问题:

在 Python 中,您可以使用 str.replace(substr, new_substr)

这里我们讨论的可能是一个字符串列表(我知道在这种情况下列表中只有一个字符串),所以列表推导派上用场了。

csv_writers[k].writerow([v.replace('""', '"') for v in row[0:1]])

这会生成一个新列表,其中所有字符串都已将 "" 替换为 "

希望对你有帮助!

【讨论】:

  • 完美,非常感谢!
  • 另外,有没有办法用“”替换“”等文本?
  • 你的意思是空字符串("")和问号("?")吗?
  • 没有双引号,单引号("")和(")
  • 我会更新我的答案,如果我误解了告诉我:-)
【解决方案2】:

如果您使用 pandas 函数:read_csvto_csv

剩下的是here

df.drop('column_name', axis=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多