Rather than use the higher-level Resource interface Bucket, which will simply give you a list of all objects within the bucket, you can use the lower-level Client interface. Specifically, if you include the Delimiter parameter when calling list_objects_v2 then the results will return the objects at the given prefix in "Contents" and the 'sub-folders' in "CommonPrefixes".
Example:
import boto3
s3 = boto3.client("s3")
rsp = s3.list_objects_v2(Bucket="mybucket", Prefix="myprefix/", Delimiter="/")
print("Objects:", list(obj["Key"] for obj in rsp["Contents"]))
print("Sub-folders:", list(obj["Prefix"] for obj in rsp["CommonPrefixes"]))
Sample output with Prefix="csv/":
Objects: ['csv/a.csv', 'csv/b.csv', 'csv/c.csv']
Sub-folders: ['csv/corrupt/', 'csv/complete/']
If you do not include the Delimiter parameter, then all objects at this prefix and below will be present in the "Contents", for example:
Objects: ['csv/a.csv', 'csv/b.csv', 'csv/c.csv', 'csv/corrupt/d.csv', 'csv/complete/e.csv']