用于生成外观真实的丑陋CSV的Python包。
项目描述
丑陋CSV生成器
Python包,用于自动丑化CSV文件。为什么?为了提高必须能够支持严重损坏的输入数据的管道的测试能力。
此处自动生成的所有损坏都是非破坏性的,这意味着它们会在数据中引起混淆,但不会损坏或破坏信息。
自动损坏的灵感都来自真实的CSV文件(叹气)
人类总是以不断出现的新损坏输入数据来让我们感到惊讶,但嘿,我们可以尽量破坏测试CSV文件!
我如何安装这个包?
像往常一样,只需使用pip下载即可
pip install ugly_csv_generator
使用示例
要破坏CSV文件,可以使用以下代码片段。在下面的示例中,我们使用random_csv_generator生成一个随机的“健康”csv。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(csv)
初始CSV将看起来像这样
region | province | surname |
---|---|---|
Calabria | Catanzaro | Rossi |
Sicilia | Ragusa | Pinna |
Lombardia | Varese | Sbrana |
Lazio | Roma | Mair |
Sicilia | Messina | Ferrari |
结果丑化CSV将看起来像这样
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
0 | //// | #RIF! | #RIF! | 0 | .... | 0 |
1 | "('surname',)('.',)(0,)" | region | province | surname | "('province',)('_',)(1,)" | |
2 | //////// | region | "province " | "surname " | 0 | 0 |
3 | /////// | "region " | "province " | "surname " | #RIF! | #RIF! |
4 | Calabria | "Catanzaro " | "Rossi " | 0 | -------- | |
5 | " " | Sicilia | Ragusa | "Pinna " | " " | |
6 | ------- | #RIF! | #RIF! | 0 | " " | |
7 | ///////// | "Lombardia " | "Varese " | Sbrana | /////////// | |
8 | --------- | "Lazio " | "Roma " | "Mair " | ||
9 | -------- | 0 | ///// | --- | 0 | ///// |
10 | #RIF! | "Sicilia " | Messina | "Ferrari " | 0 | |
11 | 0 | ----- | " " | -------- | 0 |
可用的丑化方法
让我们来看看可用的压缩选项!所有这些选项都可以作为关键字参数在 uglify
函数中使用。
我们从之前的示例开始,但现在我们将扩展所有可用的选项。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = True,
empty_rows = True,
duplicate_schema = True,
empty_padding = True,
nan_like_artefacts = True,
replace_zeros = True,
replace_ones = True,
satellite_artefacts = False,
random_spaces = True,
include_unicode = True,
verbose = True,
seed = 42,
)
让我们通过充分的示例来分解所有可用的选项。在所有情况下,我们将使用以下CSV作为起点,该CSV来自 random_csv_generator
包。
from random_csv_generator import random_csv
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
初始CSV将看起来像这样
region | province | surname | |
---|---|---|---|
0 | 威尼托 | 维琴察 | 萨科 |
1 | 阿布鲁佐 | 拉奎拉 | 萨拉 |
2 | Sicilia | Messina | 萨纳 |
3 | 马尔凯 | 安科纳 | 加洛 |
4 | Lazio | 弗罗西诺内 | 加洛 |
空列
在以下示例中,我们将在CSV中仅添加空列。这种现象在数据输入人员在表格中间留下空列时很常见。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = True,
empty_rows = False,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
seed = 424,
)
结果将类似于
region_2 | region_0 1 | region | region_0 | province | surname | |
---|---|---|---|---|---|---|
0 | 威尼托 | 维琴察 | 萨科 | |||
1 | 阿布鲁佐 | L Aquila | 萨拉 | |||
2 | Sicilia | Messina | 萨纳 | |||
3 | 马尔凯 | 安科纳 | 加洛 | |||
4 | Lazio | 弗罗西诺内 | 加洛 |
空行
在以下示例中,我们将在CSV中仅添加空行。这种现象在数据输入人员在表格中间留下空行时很常见。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = True,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
seed = 424,
)
结果将类似于
region | province | surname | |
---|---|---|---|
0 | 威尼托 | 维琴察 | 萨科 |
1 | 阿布鲁佐 | L Aquila | 萨拉 |
2 | Sicilia | Messina | 萨纳 |
3 | |||
4 | 马尔凯 | 安科纳 | 加洛 |
5 | Lazio | 弗罗西诺内 | 加洛 |
6 |
重复模式
在以下示例中,我们将在CSV中仅重复模式。这种现象在数据输入人员多次复制表头或多个CSV连接在一起而没有删除表头时很常见。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = True,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
seed = 424,
)
结果将类似于
region | province | surname | |
---|---|---|---|
0 | 威尼托 | 维琴察 | 萨科 |
1 | 阿布鲁佐 | L Aquila | 萨拉 |
2 | Sicilia | Messina | 萨纳 |
3 | region | province | surname |
4 | 马尔凯 | 安科纳 | 加洛 |
5 | Lazio | 弗罗西诺内 | 加洛 |
6 | region | province | surname |
空填充
在以下示例中,我们将在CSV中仅添加空填充。在这里,填充表示数据输入人员在某个文档中间开始表格时。这。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = False,
empty_padding = True,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
seed = 424,
)
结果将类似于
0 | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|
0 | region | province | surname | |||
1 | 威尼托 | 维琴察 | 萨科 | |||
2 | 阿布鲁佐 | L Aquila | 萨拉 | |||
3 | Sicilia | Messina | 萨纳 | |||
4 | 马尔凯 | 安科纳 | 加洛 | |||
5 | Lazio | 弗罗西诺内 | 加洛 | |||
6 | ||||||
7 | ||||||
8 | ||||||
9 | ||||||
10 | ||||||
11 |
类似于NaN的伪迹
在以下示例中,我们将在CSV中仅添加类似于NaN的伪迹。这种现象在数据输入人员遵循一些自定义标记来表示缺失值时很常见。这些标记可能是他们自己的或办公室的标准。在某些情况下,这可能是类似于 "N/A"、"NaN"、"NULL" 或甚至(一个或多个) "-"、"\\n" 或 "\\t" 的字符串。由于该包的目标是不破坏信息,因此它仅将NaN值替换为类似于NaN的伪迹。
在之前考虑的示例中,我们没有NaN值,所以我们将通过启用 empty_rows
选项将一些添加到CSV中。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = True,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = True,
satellite_artefacts = False,
random_spaces = False,
seed = 424,
)
结果将类似于
region | province | surname | |
---|---|---|---|
0 | 威尼托 | 维琴察 | 萨科 |
1 | 阿布鲁佐 | L Aquila | 萨拉 |
2 | Sicilia | Messina | 萨纳 |
3 | " " | ... | ---- |
4 | 马尔凯 | 安科纳 | 加洛 |
5 | Lazio | 弗罗西诺内 | 加洛 |
6 | " | ------- |
Unicode变体
类似于NaN的伪迹也可以用Unicode字符应用。这有助于测试CSV读取器对Unicode字符的鲁棒性。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = True,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = True,
satellite_artefacts = False,
random_spaces = False,
include_unicode = True,
seed = 424,
)
结果将类似于
region | province | surname | |
---|---|---|---|
0 | Calabria | Catanzaro | Rossi |
1 | Sicilia | Ragusa | Pinna |
2 | Lombardia | Varese | Sbrana |
3 | . | ᴑ | 0 |
4 | Lazio | Roma | Mair |
5 | Sicilia | Messina | Ferrari |
6 | ₀ | ________ | ᪐ |
替换零
在以下示例中,我们将在CSV中仅用自定义值替换零。在不同的地方和不同的办公室,零可能有不同的表示方式。来自不同字母表或甚至不同符号的零字符可以用来表示零。请注意,此功能仅在将 include_unicode
选项设置为 True
时启用。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
# We add a column with zeros
csv["zero"] = 0
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
replace_zeros = True,
include_unicode = False,
seed = 424,
)
结果将类似于
region | province | surname | zero | |
---|---|---|---|---|
0 | Calabria | Catanzaro | Rossi | 0 |
1 | Sicilia | Ragusa | Pinna | o |
2 | Lombardia | Varese | Sbrana | 0 |
3 | Lazio | Roma | Mair | 0 |
4 | Sicilia | Messina | Ferrari | O |
Unicode变体
替换零也可以用Unicode字符应用。这有助于测试CSV读取器对Unicode字符的鲁棒性。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
# We add a column with zeros
csv["zero"] = 0
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
replace_zeros = True,
include_unicode = True,
seed = 424,
)
结果将类似于
region | province | surname | zero | |
---|---|---|---|---|
0 | Calabria | Catanzaro | Rossi | o |
1 | Sicilia | Ragusa | Pinna | ᪐ |
2 | Lombardia | Varese | Sbrana | ο |
3 | Lazio | Roma | Mair | 𝟘 |
4 | Sicilia | Messina | Ferrari | ᥆ |
替换一
在以下示例中,我们将在CSV中仅用自定义值替换一。在不同的地方和不同的办公室,一可能有不同的表示方式。来自不同字母表或甚至不同符号的一字符可以用来表示一。请注意,此功能仅在将 include_unicode
选项设置为 True
时启用。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
# We add a column with ones
csv["one"] = 1
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
replace_ones = True,
include_unicode = False,
seed = 424,
)
结果将类似于
region | province | surname | one | |
---|---|---|---|---|
0 | Calabria | Catanzaro | Rossi | 1 |
1 | Sicilia | Ragusa | Pinna | l |
2 | Lombardia | Varese | Sbrana | 1 |
3 | Lazio | Roma | Mair | 1 |
4 | Sicilia | Messina | Ferrari | I |
Unicode变体
替换一也可以用Unicode字符应用。这有助于测试CSV读取器对Unicode字符的鲁棒性。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
# We add a column with ones
csv["one"] = 1
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = False,
replace_ones = True,
include_unicode = True,
seed = 424,
)
结果将类似于
region | province | surname | one | |
---|---|---|---|---|
0 | Calabria | Catanzaro | Rossi | ¹ |
1 | Sicilia | Ragusa | Pinna | ₁ |
2 | Lombardia | Varese | Sbrana | l |
3 | Lazio | Roma | Mair | 1 |
4 | Sicilia | Messina | Ferrari | ⓵ |
卫星伪迹
在以下示例中,我们将仅向CSV添加卫星数据。卫星数据可能是最奇特且最令人烦恼的数据,它代表数据输入人员在表格旁边添加注释的情况。我遇到的一个真实例子是,数据输入人员在表格旁边添加了办公室午餐订单,但忘记删除。
该软件包提供了在野外遇到的几种卫星数据。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = True,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = True,
random_spaces = False,
seed = 424,
)
结果将类似于
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 随机 | ||||
1 | 随机 | ||||
2 | 案例 | ||||
3 | region | province | surname | ||
4 | 威尼托 | 维琴察 | 萨科 | ||
5 | 阿布鲁佐 | L Aquila | 萨拉 | ||
6 | Sicilia | Messina | 萨纳 | ||
7 | 马尔凯 | 安科纳 | 加洛 | ||
8 | Lazio | 弗罗西诺内 | 加洛 | ||
9 | |||||
10 | |||||
11 | |||||
12 | |||||
13 | |||||
14 | |||||
15 | 人员 | 食物 | |||
16 | 杰瑞 | 烤肉串 | |||
17 | 史蒂文 | 辣椒米饭 | |||
18 | 瓦莱 | 带菠萝的披萨 |
随机空格
在以下示例中,我们将仅向CSV中的值周围添加随机空格。这种现象在数据输入人员对表格中值的空格不够小心时很常见,例如为了在视觉上对齐值。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = True,
seed = 424,
)
结果将类似于
region | province | surname | |
---|---|---|---|
0 | "威尼托 " | "维琴察 " | "萨科 " |
1 | "阿布鲁佐 " | "拉奎拉 " | "萨拉 " |
2 | "西西里 " | "墨西拿 " | "萨纳 " |
3 | "马尔凯 " | "安科纳 " | "高洛 " |
4 | "拉齐奥 " | "弗罗西诺内 " | "高洛 " |
Unicode变体
随机空格的丑化也可以使用Unicode字符。这对于测试CSV读取器对Unicode字符的健壮性很有用。
from random_csv_generator import random_csv
from ugly_csv_generator import uglify
csv = random_csv(5) # CSV with 5 lines
csv = csv[csv.columns[:3]] # We will use only the first 3 columns for this example
ugly = uglify(
csv,
empty_columns = False,
empty_rows = False,
duplicate_schema = False,
empty_padding = False,
nan_like_artefacts = False,
satellite_artefacts = False,
random_spaces = True,
include_unicode = True,
seed = 424,
)
由于Markdown渲染的限制,我们无法在此显示结果。您可以通过运行代码片段来查看结果。这真是太糟糕了!
贡献
您遇到了想添加到软件包中的新类型的数据丑化?您有一个新功能或改进的建议?您发现了一个错误?请提交问题或拉取请求,我将很高兴帮助您!
许可证
本项目采用MIT许可证 - 有关详细信息,请参阅LICENSE文件。
项目详情
ugly_csv_generator-1.1.4.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6e5f0530e05bd6cd18e364f443faaa0d2110c3fa137e2835fd2fc1cfb62cc02d |
|
MD5 | df5370cc3b527f988e1f3ab70b25c150 |
|
BLAKE2b-256 | fdadcd582d329bff6e569567b859914f77cc0e8f818bfe38762841c91578a07b |