如何在 python 的 for 循环中正确写入 CSV 文件?
How do I properly write a CSV file within a for loop in python?
我正在使用以下代码从网页中抓取内容,最终目标是写入 CSV。在第一次迭代中,我让这部分工作正常,但现在我的数据格式不同,当我尝试在 excel.
中查看数据时,它以一种被破坏的方式写入数据
如果我使用下面的代码,在 excel 中查看时,“heading.text”数据会正确地放入一个单元格中。其中,“child.text”的内容被打包到一个单元格中,而不是根据逗号拆分。您会看到我已尝试清理“child.text”的内容,以查看这是否是我的问题。
如果我从“z”中删除“heading.text”并重试,它会以 excel 每个单元格显示一个字母的方式书写。最后,我希望在 excel 中查看时,每个用逗号分隔的值都显示在一个单元格中,我相信我在构造“z”和/或编写行。
任何指导将不胜感激。谢谢。
csvwriter = csv.writer(csvfile)
for heading in All_Heading:
driver.execute_script("return arguments[0].scrollIntoView(true);", heading)
print("------------- " + heading.text + " -------------")
ChildElement = heading.find_elements_by_xpath("./../div/div")
for child in ChildElement:
driver.execute_script("return arguments[0].scrollIntoView(true);", child)
#print(heading.text)
#print(child.text)
z = (heading.text, child.text)
print (z)
csvwriter.writerow(z)
当我打印“z”时,我得到以下信息:
('Flower', 'Afghani 3.5g Pre-Pack Details\nGREEN GOLD ORGANICS\nAfghani 3.5g Pre-Pack\nIndica\nTHC: 16.2%\n1/8 oz - \n.00')
当我使用在“\n”上拆分字符串的旧代码打印“z”时,我得到以下信息:
('Flower', "Cherry Limeade 3.5g Flower - BeWell Details', 'BE WELL', 'Cherry Limeade 3.5g Flower - BeWell', 'Hybrid', 'THC: 18.7 mg', '1/8 oz - ', '.67")
csv.writerow()
采用一个可迭代对象,其中的每个元素都由作者的定界符分隔,即构成一个不同的单元格。
首先让我们看看你到现在都发生了什么:
- (heading.text, child.text) 有两个元素,即两个单元格,heading.text 和 child.text
- (child.text) 只是 child.text (如果它是 (child.text**,**) 就是一个元组)并且字符串的元素是每个字母。因此每个字母都有自己的单元格。
为了在一行中获取不同的单元格,我们需要在可迭代对象中使用单独的元素,因此我们需要一个可迭代对象,例如 [header.text、child.text 第 1 行、child.text 第 2 行,.. .]。您将文本分成几行是正确的,但没有正确地添加这些行。
元组是不可变的,我将使用列表代替:
- 我们知道heading.text是取一个单元格所以我们可以写下面的开头
row = [heading.text] # this is what your z is
- 我们希望每一行都是一个单独的元素,所以我们拆分 child.text:
lines = child.text.split("\n")
# The text doesn’t start or end with a newline so this should suffice
- 现在我们希望每个元素分别添加到行中,我们可以使用列表的 extend() 方法:
row.extend(lines)
# [1, 2].extend([3, 4, 5]) would result in [1, 2, 3, 4, 5]
累积起来:
row = [heading.text]
lines = child.text.split("\n")
row.extend(lines)
或在一行中解包:
row = [heading.text, *child.text.split("\n")] # You can also use a tuple here
我正在使用以下代码从网页中抓取内容,最终目标是写入 CSV。在第一次迭代中,我让这部分工作正常,但现在我的数据格式不同,当我尝试在 excel.
中查看数据时,它以一种被破坏的方式写入数据如果我使用下面的代码,在 excel 中查看时,“heading.text”数据会正确地放入一个单元格中。其中,“child.text”的内容被打包到一个单元格中,而不是根据逗号拆分。您会看到我已尝试清理“child.text”的内容,以查看这是否是我的问题。
如果我从“z”中删除“heading.text”并重试,它会以 excel 每个单元格显示一个字母的方式书写。最后,我希望在 excel 中查看时,每个用逗号分隔的值都显示在一个单元格中,我相信我在构造“z”和/或编写行。
任何指导将不胜感激。谢谢。
csvwriter = csv.writer(csvfile)
for heading in All_Heading:
driver.execute_script("return arguments[0].scrollIntoView(true);", heading)
print("------------- " + heading.text + " -------------")
ChildElement = heading.find_elements_by_xpath("./../div/div")
for child in ChildElement:
driver.execute_script("return arguments[0].scrollIntoView(true);", child)
#print(heading.text)
#print(child.text)
z = (heading.text, child.text)
print (z)
csvwriter.writerow(z)
当我打印“z”时,我得到以下信息:
('Flower', 'Afghani 3.5g Pre-Pack Details\nGREEN GOLD ORGANICS\nAfghani 3.5g Pre-Pack\nIndica\nTHC: 16.2%\n1/8 oz - \n.00')
当我使用在“\n”上拆分字符串的旧代码打印“z”时,我得到以下信息:
('Flower', "Cherry Limeade 3.5g Flower - BeWell Details', 'BE WELL', 'Cherry Limeade 3.5g Flower - BeWell', 'Hybrid', 'THC: 18.7 mg', '1/8 oz - ', '.67")
csv.writerow()
采用一个可迭代对象,其中的每个元素都由作者的定界符分隔,即构成一个不同的单元格。
首先让我们看看你到现在都发生了什么:
- (heading.text, child.text) 有两个元素,即两个单元格,heading.text 和 child.text
- (child.text) 只是 child.text (如果它是 (child.text**,**) 就是一个元组)并且字符串的元素是每个字母。因此每个字母都有自己的单元格。
为了在一行中获取不同的单元格,我们需要在可迭代对象中使用单独的元素,因此我们需要一个可迭代对象,例如 [header.text、child.text 第 1 行、child.text 第 2 行,.. .]。您将文本分成几行是正确的,但没有正确地添加这些行。 元组是不可变的,我将使用列表代替:
- 我们知道heading.text是取一个单元格所以我们可以写下面的开头
row = [heading.text] # this is what your z is
- 我们希望每一行都是一个单独的元素,所以我们拆分 child.text:
lines = child.text.split("\n")
# The text doesn’t start or end with a newline so this should suffice
- 现在我们希望每个元素分别添加到行中,我们可以使用列表的 extend() 方法:
row.extend(lines)
# [1, 2].extend([3, 4, 5]) would result in [1, 2, 3, 4, 5]
累积起来:
row = [heading.text]
lines = child.text.split("\n")
row.extend(lines)
或在一行中解包:
row = [heading.text, *child.text.split("\n")] # You can also use a tuple here