下面的代码旨在创建一个名为'file-0.csv'的csv文件,并通过迭代for循环开始写行直到达到100行。当达到限制时,它应该停止写入'file-0.csv',创建'file-1.csv',继续它停止的for循环,开始写'文件' -1.csv'直到它达到100行,依此类推,直到for循环完成。
下面代码的实际行为(完整和可执行)是它按预期创建新文件(总共4个),但它继续将所有行写入'file-0'....
##### Python 3.5 #####
import csv
rowCounter = 0
fileCounter = 0
List_A = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_B = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_C = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
def new_file():
global fileCounter
fileCounter += 1
with open('file-' + str(fileCounter) + '.csv', 'w') as csvfile:
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
with open('file-' + str(fileCounter) + '.csv', 'w') as csvfile:
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
for word1 in List_A:
for word2 in List_B:
for word3 in List_C:
sentence = word1 + word2 + word3
rowWriter.writerow ([sentence])
rowCounter += 1
if rowCounter == 100:
new_file()
rowCounter = 0
else:
continue
与上述代码相同,但评论很多:
##### Python 3.5 #####
######################
####### Setup ########
######################
### Use the CSV library
import csv
### Initialize counters
rowCounter = 0
fileCounter = 0
### Create three lists of 'words'
List_A = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_B = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_C = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
### Function/subroutine that creates new CSV file with incremented filename
def new_file():
### Make the variable 'fileCounter' usable by the function
global fileCounter
### Add 1 to 'fileCounter'
fileCounter += 1
### Create new CSV file using the value of 'fileCounter' as part of the name
with open('file-' + str(fileCounter) + '.csv', 'w') as csvfile:
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
######################
#### Main Program ####
######################
### Create initial CSV file using the value of 'fileCounter' as part of the name
with open('file-' + str(fileCounter) + '.csv', 'w') as csvfile:
### Create writer object and define how it should behave
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
### Create & Write lines ###
### Nested 'for' loops to iterate through all combinations of words
for word1 in List_A:
for word2 in List_B:
for word3 in List_C:
### Build our 'sentence' from the current iteration
sentence = word1 + word2 + word3
### Write 'sentence' to file
rowWriter.writerow ([sentence])
### Increment row counter
rowCounter += 1
### Check if value of rowCounter is 100 and if so, execute
### 'new_file' and reset rowCounter to 0. If not, continue.
if rowCounter == 100:
new_file()
rowCounter = 0
else:
continue
我怀疑问题是'rowWriter'没有得到更新或正确地传回主循环,但我似乎无法弄清楚如何做到(而且无论如何,我甚至不确定是不是这样)
我试图记录并使代码“通用”,以便其他人可以从任何答案中获得一些用处。非常感谢任何帮助。
答案 0 :(得分:2)
离开with
块关闭文件。因此,new_file
函数只会打开并立即关闭文件。
你可以做如下事情:
import csv
rowCounter = 0
fileCounter = 0
List_A = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_B = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_C = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
# create file handle
csvfile = open('file-' + str(fileCounter) + '.csv', 'w')
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
for word1 in List_A:
for word2 in List_B:
for word3 in List_C:
sentence = word1 + word2 + word3
rowWriter.writerow ([sentence])
rowCounter += 1
if rowCounter == 100:
# close current filehandle
csvfile.close()
fileCounter += 1
# open new file
csvfile = open('file-' + str(fileCounter) + '.csv', 'w')
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
rowCounter = 0
# close file
csvfile.close()
或定义函数:
import csv
rowCounter = 0
fileCounter = 0
List_A = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_B = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_C = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
def new_writer( csvfile, counter ):
if csvfile:
csvfile.close()
# open new file
csvfile = open('file-' + str(counter) + '.csv', 'w')
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
counter += 1
return rowWriter,csvfile,counter
rowWriter, csvFile, fileCounter = new_writer( None, fileCounter )
for word1 in List_A:
for word2 in List_B:
for word3 in List_C:
sentence = word1 + word2 + word3
rowWriter.writerow ([sentence])
rowCounter += 1
if rowCounter == 100:
# close current file and open a new one
rowWriter, csvfile, counter = new_writer( csvfile, fileCounter )
rowCounter = 0
# close file
csvFile.close()
答案 1 :(得分:0)
谢谢@desiato!
我接受了你的答案,但最终使用了你的代码的第23-29行并最终得到了这个(它很棒!):
import csv
rowCounter = 0
fileCounter = 0
List_A = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_B = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
List_C = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
with open('file-' + str(fileCounter) + '.csv', 'w') as csvfile:
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
for word1 in List_A:
for word2 in List_B:
for word3 in List_C:
sentence = word1 + word2 + word3
rowWriter.writerow ([sentence])
rowCounter += 1
if rowCounter == 100:
csvfile.close()
fileCounter += 1
csvfile = open('file-' + str(fileCounter) + '.csv', 'w')
rowWriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE)
rowCounter = 0
else:
continue