【问题标题】:Split csv file into two separate files python 3.7将csv文件拆分为两个单独的文件python 3.7
【发布时间】:2019-11-17 22:26:07
【问题描述】:

我有一个 csv 文件,需要拆分为两个 csv 文件(file1.csv 和 file2.csv)。拆分应该发生 - 基于列“名称”。 70% 的行需要写入 file1.csv,剩下的 30% 需要写入 file2.csv。例如,有 10 行命名为“AAA”。所以 10 行中的 70% 意味着“AAA”的前 7 行需要写入 file1.csv,接下来的 3 行需要写入 file2.csv。就像“名称”列下的所有名称一样,这需要发生。 如果获得十进制数示例 0.7 x 9 行 = 6.3。然后前 6 行(四舍五入)到 file1.csv,其余 3 行到 file2.csv 如何使用 Python 代码完成这项工作?谢谢https://fil.email/FPYB1RWd

【问题讨论】:

  • 开始写一些代码
  • 发布您目前拥有的内容,我们可以从那里为您提供帮助
  • 请 (a) 发布您的代码 (b) 格式化您的问题以便于阅读,并 (c) 说明您发布下载链接的原因。

标签: python python-3.x csv


【解决方案1】:

读取整个 csv 文件并将内容存储在列表中。然后将类似的 csv 数据存储在临时列表中。存储后,从列表中提取70%的数据写入文件,剩余的数据写入另一个文件。

csv_data = []
with open ('file.csv') as file:
    csv_data.append(file.read())
csv_data = (''.join(csv_data)).split("\n")
header = csv_data[0]
csv_data = csv_data[1:]
temp_list = []
add_header = True
for i in csv_data:
    if len(temp_list) == 0:
        temp_list.append(i)
    elif i.split(',')[0] == temp_list[0].split(',')[0]:
        temp_list.append(i)
    else:
        file_length = len(temp_list)
        line_count = int((0.7*file_length)+1)
        if line_count == 1:
            with open("file1.csv","a+") as file1:
                if add_header:
                    add_header = False
                    file1.write(header+'\n')
                file1.write(temp_list[0]+'\n')
        else:
            seventy_perc_lines = temp_list[:line_count]
            thirty_perc_lines = temp_list[line_count:]
            if add_header:
                seventy_perc_lines.insert(0,header)
                thirty_perc_lines.insert(0,header)
                add_header = False
            with open("file1.csv","a+") as file1:
                for j in range(len(seventy_perc_lines)):
                    file1.write(seventy_perc_lines[j]+'\n')
            if len(thirty_perc_lines) != 0:
                with open("file2.csv","a+") as file2:
                    for j in range(len(thirty_perc_lines)):
                        file2.write(thirty_perc_lines[j]+'\n')
        temp_list = []
        temp_list.append(i)

file1.csv

file2.csv

注意:如果只有 3 行,此代码将添加 file1 中的所有 3 行,并且不向 file2 添加任何内容。如果您希望更改此行为,则需要编辑此代码。

【讨论】:

  • 谢谢。但我没有得到所需的输出。我只得到两个文件 file1.csv 和 file2.csv,只有标题。两个文件中都没有数据。
  • 检查您是否正确读取文件。读取数据后打印。仅在使用您在问题中提供的 csv 文件进行测试后,我才发布了答案。
  • 您显示的输出正是我所需要的。我已附上代码fil.email/EP6cpvzj,如果我在任何地方做错了,请告诉我。再次感谢
  • 你能附上Alldata99.csv吗?
  • 我已经修改了我的代码。问题是因为您提供的示例文件只有一列,其余列是空白的。所以我比较了整行。现在我更改了代码以仅比较第一行。现在它工作正常。我已附上您的示例文件here
【解决方案2】:

很简单:制作一个包含记录列表的字典,以给定列的内容为键(这里我使用了第 0 列),然后在这些上循环 根据 OP 指定的简单规则,列出并输出两个输出文件之一的记录列表中包含的每条记录。

from csv import reader, writer

inp = reader(open(...))
outs = [writer(open(fnm, 'w') for fnm in ('f30', 'f70')]

column, d = 0, {}

for rec in inp0:
    d.setdefault(rec[column], []).append(rec)

for recs in d.values():
    l = round(0.7*len(recs))
    for n, rec in enumerate(recs):
        outs[n<l].writerow(rec)

布尔值是整数的子类,其值为 1(当 n&lt;l 时)或 0,可用于索引 writer s 的列表。

这里是这个方法的检查,使用 IPython 会话(略 编辑以减少空白)和一些人工数据

17:22:~ $ ipython
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.5.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from csv import reader, writer
   ...: from random import randrange, seed
   ...: seed(20190712)
In [2]: data = [','.join(str(randrange(10)) for _ in range(4)) for _ in range(200)]
In [3]: inf = reader(data)
In [4]: of1 = writer(open('dele1', 'w')); of2 = writer(open('dele2', 'w'))
In [5]: d = {}
In [6]: for record in inf:
   ...:     d.setdefault(record[0], []).append(record)
   ...: for key, records in d.items():
   ...:     l1 = round(0.7*len(records))
   ...:     for n, record in enumerate(records):
   ...:         (of1 if n<l1 else of2).writerow(records)
In [7]: Ctrl-D
Do you really want to exit ([y]/n)?
17:23:~ $ wc -l dele?
  140 dele1
   60 dele2
  200 total
17:24:~ $ rm dele?
17:24:~ $

如您所见,第一个文件获取了 70% 的原始记录,而 第二个获得剩余的 30%。

【讨论】:

  • 谢谢。但它不起作用。我只得到一个由 of1 声明的 csv 文件。该文件与输入 csv 文件相同。数据尚未拆分。
【解决方案3】:

""" 将您的原始文件名代替 your_file_name 使用此功能,该功能将拆分 csv 文件并保存。 您可以更改拆分百分比以获得不同的文件大小 """

def split_csv("your_file_name.csv"):
    import pandas as pd
    df = pd.read_csv("your_file_name.csv")
    split_percent = 0.7
    df_length = int(len(df)*split_percent)
    df1 = df.iloc[:df_length,:]
    df2 = df.iloc[df_length:,:]
    df1.to_csv("file1.csv")
    df2.to_csv("file2.csv")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多