在固定数量的元素之后在 python 文件中插入换行符以分隔 csv 文件中的列
insert line break in python file after a fix number of elements to delimit columns in a csv file
我一直在努力在 python 中找到一种方法来强制此文件在一定数量的元素(等于我需要的列数)之后创建一个跳转到新行添加这是 12) CSV 当前看起来像这样。
第一行的文字如下所示。
D276",31386,10610,12122021 00:00:47840 85,0.00+842646,M000395708109323,ACTIVE CARD CHECK,844-6593879,NY,59655,840 6511011091718056,D27011091718056,D270,12056,D270,12056,D276,12056 [ 29=],5.36-842647,M527021000201360,Etsy.com - TheCraftyCa 布鲁克林,纽约,56995,840 6511011091718056,D276,86495,29807,12122021 00:08:22840N51,11.99-843648,7170,M247 *youtubremium g。co/helppay#ca,78295,840 6511016547548056,D276,29969,10038,12122021 [= 31 = 31 = 31 =] 57,11.30-842649,11.30-842649,麦克罗,62521,21152,12122021 00:28:54840N51,5.40-842650,M527021000211443,Google Play,Mountain View CA,58175,840 651101101111173278056,D276,496,496,1222222222222222222222222222222222111111111111111111111111111111111111111111111111111111111111111112229999999999太体[ ,AMZN MKTP US,AMZN。 ,D276,125175,45529,12122021 00:31:50840Y05,0.00+842653,M145376000144509,PLAYSTATION网络,800-345-7669 CA,58165,840 6511020299078056,D276,1251 75,45529,12122021 00:32:07840Y57,21.44-842654,M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:08840Y57,21.44-842299,M527021000222747 ,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529,12122021 00:32:09840Y57,21.44-842300,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529, 12122021 00:32:09840 57,0.00+842655,MCARD ACCPT IDC,Sony - Playstation N.. St. Louis,USA,59695,840 6511020299078056,D276,125175,45529,12122021 00:32:27840Y57,21.44-842301, M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:28840Y57,21.44-842657,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276, 125175,45529,12122021 00:32:28840Y57,21.44-842656,M527021000222747,PLAYSTATIONNETWORK,SAN MATEO,CA,CA,58185,840 6511020202999078056,D278056,1276,125155555555555555555555555555555555555555太平洋,Sony - Playstation N.. St. Louis,USA,59695,840 651102029907 8056,D276,112802,40216,12122021 00:32:30840Y00,6.49-842659,M784959000762203,Amazon.com,Amzn.com/bill WA,59425,840 6511019112388056,D276,1211=29207,124 [ 45 =] 05,3.12-67433,P536385810103481,米尔斯食品中心,加利福尼亚州奥克兰,54115,840 6511019841028056,D276,120407,44199,199,12122021 [ CA,54115,840 6511019841028056,D276,129143,47047,12122021
我希望它看起来像这样
继续,直到完成原始文件中的所有寄存器。
我要尝试的第一件事就是简单地用逗号分隔行,然后使用 csv.writer
写入记录,一次用十二个元素调用 .writerow()
。我注意到你在开头有一个双引号,但后来没有,所以这种方法可能就足够了,你只需要删除那个双引号。当然,如果您的文件中的任何字段在其文本中包含逗号,我的建议就会落空,但这是一个开始的地方,因为您似乎是在尝试修复一个特定的文件,而不是解决一般问题。
这是我对该建议的实施:
import csv
out_f = open("fixed-csv.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
for line in in_f:
fields = line.strip("\n\r").split(",")
for position in range(0, len(fields), 12):
writer.writerow(fields[position:position+12])
现在,我注意到 运行 该代码实际上每行并非恰好有 12 列,它更像是 10 或 11,而且不是常数。
这是一个查找 D276
并使其成为每一行的第一列的变体:
import csv
out_f = open("fixed-csv-2.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
for line in in_f:
fields = line.strip("\n\r").split(",")
d276_positions = [
i
for i, value in enumerate(fields)
if i == 0 or value == "D276"
]
d276_positions.append(len(fields))
for start, end in zip(d276_positions, d276_positions[1:]):
writer.writerow(fields[start:end])
我不认为您的所有数据都会将 D276
作为行中的第一个值,因此您可能必须将 if i == 0 or value == "D276"
更改为更普遍地定位标记 a 的字段的值新行,但是这段代码应该让你知道你需要解决你的问题,假设,正如我在开头所说的那样,你的整个数据文件中的任何字段中都没有逗号。
如果您的某些字段中确实有逗号,我会使用文本编辑器手动编辑输出文件并手动修补问题。如果没有太多,应该不会有很多工作。
这是 pandas
+ numpy
方法。
import io
import numpy as np
import pandas as pd
data =""""
D276",31386,10610,12122021 00:00:47840 85,...
"""
df = pd.read_csv(io.StringIO(data), delimiter=",", quoting=3, header=None)
# resize array to multiple of cols
cols = 11
remainder = cols - df.shape[1] % cols
values = np.append(df.to_numpy(), np.empty((1,remainder)))
df_reshaped = pd.DataFrame(values.reshape((-1,cols)))
输出:
0 1 2 3 4 5 6 7 8 9 10
0 D276" 31386 10610 12122021 00:00:47840 85 0.00+842646 M000395708109323 ACTIVE CARD CHECK 844-6593879 NY 59655 840 6511011091718056
1 D276 31386 10610 12122021 00:00:59840Y00 5.36-842647 M527021000201360 Etsy.com - TheCraftyCa Brooklyn NY 56995 840 6511011091718056 D276
2 86495 29807 12122021 00:08:22840N51 11.99-842648 M248747000103177 GOOGLE *YouTubePremium g.co/helppay# CA 78295 840 6511016547548056 D276 29969 10038
请注意,在 cols
列之后中断仅适用于前两行。您可能需要考虑另一个标准 e。 G。 'D276'
,如 joanis 的回答。
我一直在努力在 python 中找到一种方法来强制此文件在一定数量的元素(等于我需要的列数)之后创建一个跳转到新行添加这是 12) CSV 当前看起来像这样。
第一行的文字如下所示。
D276",31386,10610,12122021 00:00:47840 85,0.00+842646,M000395708109323,ACTIVE CARD CHECK,844-6593879,NY,59655,840 6511011091718056,D27011091718056,D270,12056,D270,12056,D276,12056 [ 29=],5.36-842647,M527021000201360,Etsy.com - TheCraftyCa 布鲁克林,纽约,56995,840 6511011091718056,D276,86495,29807,12122021 00:08:22840N51,11.99-843648,7170,M247 *youtubremium g。co/helppay#ca,78295,840 6511016547548056,D276,29969,10038,12122021 [= 31 = 31 = 31 =] 57,11.30-842649,11.30-842649,麦克罗,62521,21152,12122021 00:28:54840N51,5.40-842650,M527021000211443,Google Play,Mountain View CA,58175,840 651101101111173278056,D276,496,496,1222222222222222222222222222222222111111111111111111111111111111111111111111111111111111111111111112229999999999太体[ ,AMZN MKTP US,AMZN。 ,D276,125175,45529,12122021 00:31:50840Y05,0.00+842653,M145376000144509,PLAYSTATION网络,800-345-7669 CA,58165,840 6511020299078056,D276,1251 75,45529,12122021 00:32:07840Y57,21.44-842654,M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:08840Y57,21.44-842299,M527021000222747 ,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529,12122021 00:32:09840Y57,21.44-842300,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529, 12122021 00:32:09840 57,0.00+842655,MCARD ACCPT IDC,Sony - Playstation N.. St. Louis,USA,59695,840 6511020299078056,D276,125175,45529,12122021 00:32:27840Y57,21.44-842301, M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:28840Y57,21.44-842657,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276, 125175,45529,12122021 00:32:28840Y57,21.44-842656,M527021000222747,PLAYSTATIONNETWORK,SAN MATEO,CA,CA,58185,840 6511020202999078056,D278056,1276,125155555555555555555555555555555555555555太平洋,Sony - Playstation N.. St. Louis,USA,59695,840 651102029907 8056,D276,112802,40216,12122021 00:32:30840Y00,6.49-842659,M784959000762203,Amazon.com,Amzn.com/bill WA,59425,840 6511019112388056,D276,1211=29207,124 [ 45 =] 05,3.12-67433,P536385810103481,米尔斯食品中心,加利福尼亚州奥克兰,54115,840 6511019841028056,D276,120407,44199,199,12122021 [ CA,54115,840 6511019841028056,D276,129143,47047,12122021
我希望它看起来像这样
继续,直到完成原始文件中的所有寄存器。
我要尝试的第一件事就是简单地用逗号分隔行,然后使用 csv.writer
写入记录,一次用十二个元素调用 .writerow()
。我注意到你在开头有一个双引号,但后来没有,所以这种方法可能就足够了,你只需要删除那个双引号。当然,如果您的文件中的任何字段在其文本中包含逗号,我的建议就会落空,但这是一个开始的地方,因为您似乎是在尝试修复一个特定的文件,而不是解决一般问题。
这是我对该建议的实施:
import csv
out_f = open("fixed-csv.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
for line in in_f:
fields = line.strip("\n\r").split(",")
for position in range(0, len(fields), 12):
writer.writerow(fields[position:position+12])
现在,我注意到 运行 该代码实际上每行并非恰好有 12 列,它更像是 10 或 11,而且不是常数。
这是一个查找 D276
并使其成为每一行的第一列的变体:
import csv
out_f = open("fixed-csv-2.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
for line in in_f:
fields = line.strip("\n\r").split(",")
d276_positions = [
i
for i, value in enumerate(fields)
if i == 0 or value == "D276"
]
d276_positions.append(len(fields))
for start, end in zip(d276_positions, d276_positions[1:]):
writer.writerow(fields[start:end])
我不认为您的所有数据都会将 D276
作为行中的第一个值,因此您可能必须将 if i == 0 or value == "D276"
更改为更普遍地定位标记 a 的字段的值新行,但是这段代码应该让你知道你需要解决你的问题,假设,正如我在开头所说的那样,你的整个数据文件中的任何字段中都没有逗号。
如果您的某些字段中确实有逗号,我会使用文本编辑器手动编辑输出文件并手动修补问题。如果没有太多,应该不会有很多工作。
这是 pandas
+ numpy
方法。
import io
import numpy as np
import pandas as pd
data =""""
D276",31386,10610,12122021 00:00:47840 85,...
"""
df = pd.read_csv(io.StringIO(data), delimiter=",", quoting=3, header=None)
# resize array to multiple of cols
cols = 11
remainder = cols - df.shape[1] % cols
values = np.append(df.to_numpy(), np.empty((1,remainder)))
df_reshaped = pd.DataFrame(values.reshape((-1,cols)))
输出:
0 1 2 3 4 5 6 7 8 9 10
0 D276" 31386 10610 12122021 00:00:47840 85 0.00+842646 M000395708109323 ACTIVE CARD CHECK 844-6593879 NY 59655 840 6511011091718056
1 D276 31386 10610 12122021 00:00:59840Y00 5.36-842647 M527021000201360 Etsy.com - TheCraftyCa Brooklyn NY 56995 840 6511011091718056 D276
2 86495 29807 12122021 00:08:22840N51 11.99-842648 M248747000103177 GOOGLE *YouTubePremium g.co/helppay# CA 78295 840 6511016547548056 D276 29969 10038
请注意,在 cols
列之后中断仅适用于前两行。您可能需要考虑另一个标准 e。 G。 'D276'
,如 joanis 的回答。